[深入了解线程对象与线程,线程与运行环境]
在基础篇中的第一节,我就强调过,要了解多线程编程,首要的两个概念就是线程对象
和线程.
现在我们来深入理解线程对象,线程,运行环境之间的关系,弄清Runnable与Thread的
作用.
在JAVA平台中,序列化机制是一个非常重要的机制,如果不能理解并熟练应用
序列化机制,你就不能称得一个java程序员.
在JAVA平台中,为什么有些对象中可序列化的,而有些对象就不能序列化?
能序列化的对象,简单说是一种可以复制(意味着可以按一定机制进行重构它)
的对象,这种对象说到底就是内存中一些数据的组合.只要按一定位置和顺序组合就能
完整反映这个对象.
而有些对象,是和当前环境相关的,它反映了当前运行的环境和时序,所以不能
被序列,否则在另外的环境和时序中就无法"还原".
比如,一个Socket对象:
Socket sc = new Socket("111.111.111.111",80);
这个sc对象表示当前正在运行这段代码的主机和IP为"111.111.111.111"的80
端口之间建立的一个物理连结,如果它被序列化,那么在另一个时刻在另一个主机上它如
何能被还原?Socket连结一旦断开,就已经不存在,它不可能在另一个时间被另一个主机
所重现.重现的已经不是原来那个sc对象了.
线程对象也是这种不可序列化对象,当我们new Thread时,已经初始化了当前这
个线程对象所在有主机的运行环境相关的信息,线程调度机制,安全机制等只特定于当前
运行环境的信息,假如它被序列化,在另一个环境中运行的时候原来初始化的运行环境的
信息就不可能在新的环境中运行.而假如要重新初始化,那它已经不是原来那个线程对象
了.
正如Socket封装了两个主机之间的连结,但它们并不是已经连结关传送数据了.
要想传送数据,你还要getInputStream和getOutputStream,并read和write,两台主机之间
才开始真正的"数据连结"
一个Thread对象并建立后,只是有了可以"运行"的令牌,仅仅只是一个"线程对象".
只有当它调用start()后,当前环境才会分配给它一个运行的"空间",让这段代码开始运行.
这个运行的"空间",才叫真正的"线程".也就是说,真正的线程是指当前正在执行的那一个
"事件".是那个线程对象所在的运行环境.
明白了上面的概念,我们再来看看JAVA中为什么要有Runnable对象和Thread对象.
一.从设计技巧上说,JAVA中为了实现回调,无法调用方法指针,那么利用接口来约
束实现者强制提供匹配的方法,并将实现该接口的类的实例作为参数来提供给调用者,这是
JAVA平台实现回调的重要手段.
二.但是从实际的操作来看,对于算法和数据,是不依赖于任何环境的.所以把想要
实现的操作中的算法和数据封装到一个run方法中(由于算法本身是数据的一个部分,所以我
把它们合并称为数据),可以将离数据和环境的逻辑分离开来.使程序员只关心如何实现我
想做的操作,而不要关心它所在的环境.当真正的需要运行的时候再将这段"操作"传给一个
具体当前环境的Thread对象.
三.这是最最重要的原因,[实现数据共享]
因为一个线程对象不对多次运行.所以把数据放在Thread对象中,不会被多个线程
同时访问.简单说:
class T extends Thread{
Object x;
public void run(){//......;}
}
T t = new T();
当T的实例t运行后,t所包含的数据x只能被一个t.start();对象共享,除非声明成
static Object x;
一个t的实例数据只能被一个线程访问.意思是"一个数据实例对应一个线程".
而假如我们从外部传入数据,比如
class T extends Thread{
private Object x;
public T(Object x){
this.x = x;
}
public void run(){//......;}
}
这样我们就可以先生成一个x对象传给多个Thread对象,多个线程共同操作一个数据.
也就是"一个数据实例对应多个线程".
现在我们把数据更好地组织一下,把要操作的数据Object x和要进行的操作一个封装
到Runnable的run()方法中,把Runnable实例从外部传给多个Thread对象.这样,我们就有了:
[一个对象的多个线程]
这是以后我们要介绍的线程池的重要概念.
分享到:
相关推荐
Java多线程编程实战指南(核心篇) 高清pdf带目录 随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了――如今...
《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...
《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...
**五、MFC多线程编程实践** 在MFC中创建多线程,首先创建一个继承自CWinThread的类,然后重写InitInstance和Run方法。InitInstance通常用于线程初始化,Run则包含线程的主要工作。通过调用AfxBeginThread函数或者在...
1. 创建线程:使用`std::thread`构造函数传入一个可调用对象(函数、函数指针或lambda表达式)来创建新线程。 2. 同步与join:通过调用`std::thread::join()`函数等待线程结束,避免悬挂线程;`std::thread::detach...
### 三、多线程编程的关键技术 1. **线程创建与管理**:创建线程通常涉及到线程对象的实例化和启动,以及线程的同步和调度机制。 2. **线程同步**:为了避免数据竞争和死锁,需要采用适当的同步机制,如互斥锁...
在Linux系统下进行多线程编程是开发高效并发应用程序的关键技术之一。本文将深入探讨Linux环境中的多线程概念、创建与管理线程的方法、线程同步与通信机制,以及多线程编程中可能遇到的问题和解决策略。 一、多线程...
《深入学习:Java多线程编程》是一本专注于Java并发技术的专业书籍,旨在帮助开发者深入理解和熟练运用Java中的多线程编程。Java多线程是Java编程中的核心部分,尤其在现代高性能应用和分布式系统中不可或缺。理解并...
本篇文章将详细阐述VC++中实现多线程的三种常见方法:使用`CreateThread`函数、`_beginthread`/`_beginthreadex`函数以及基于`std::thread`的C++11标准库方法。 1. **使用CreateThread函数** Windows API提供的`...
《Windows多线程编程技术与实例(C++)》是一本深入探讨Windows环境下多线程编程的书籍,特别适合正在学习或已经从事C++多线程开发的人员阅读。本书通过丰富的实例,详细讲解了如何在Windows操作系统中利用C++进行...
《C#多线程编程实战(原书第二版)源码》是一本深入探讨C#中多线程技术的专业书籍,其源码提供了丰富的实践示例,帮助读者掌握并发编程的核心概念和技术。在C#中,多线程是实现高性能、响应式应用程序的关键组成部分...
"实验一:WindowsThreads多线程编程实验"旨在让学生深入理解和实践如何在Windows系统中创建和管理线程。通过这个实验,我们可以学习到以下几个关键知识点: 1. **线程的概念**:线程是操作系统分配CPU时间的基本...
"多线程编程" 多线程编程是指在同一个程序中同时运行多个线程,以提高程序的执行效率和响应速度。多线程编程可以分为两类:用户级线程和内核级线程。用户级线程是在用户空间中实现的线程,内核级线程是在内核空间中...
在IT领域,多线程编程是一项关键技能,尤其是在操作系统如Symbian中。多线程技术允许程序同时执行多个任务,提升系统效率和用户体验。以下是对"多线程编程"这个主题的详细解释: 1. **多线程概念**:多线程是指一个...
通过学习和实践这些例子,你将能够熟练掌握C++多线程编程的核心概念,并能够在Windows平台上有效地利用多核处理器的优势,编写高效且可靠的多线程程序。记住,多线程编程需要对并发控制和错误处理有深入的理解,才能...
本书主要讲述采用现代C++ 在x86-64 Linux 上编写多线程TCP 网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。这是在Linux 下以native 语言编写用户态高性能...
在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)中的多线程编程,结合提供的标题“MFC多线程编程实例三个”以及描述中的信息,我们将会了解到如何在MFC应用中实现多线程,特别是在Tab控件中创建多个带...
本篇将深入介绍Linux多线程编程的基本概念、实现方法以及注意事项。 首先,多线程是通过创建多个执行线程来实现并发执行的。每个线程都有自己的调用栈,可以独立执行代码,共享同一地址空间内的资源,如全局变量和...