[进程 线程]
一个程序至少有一个进程,一个进程至少有一个线程. 线程是指进程内的一个执行单元,也是进程内的可调度实体.
区别:
(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
(3)线程是处理器调度的基本单位,但进程不是.
(4)二者均可并发执行.
一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
学习资料:http://www.ibm.com/developerworks/cn/java/j-lo-processthread/
线程的生命周期需要经历五种状态:
1 新建(New)——2 就绪(Runnable)——3运行(Running)——4 等待/阻塞(Wait/Blocked)——5 死亡(Dead)
1 新建(New):当一个线程对象被创建后,线程就处于新建状态。在新建状态中的线程对象从严格意义上看还只是一个普通的对象,它还不是一个独立的线程。处于新建状态中的线程被调用start方法后就会进入就绪状态。从新建状态中只能进入就绪状态,并且不能从其他状态进行新建状态。新建状态是线程生命周期的第一个状态。
2 就绪(Runnable):处于新建状态中的线程被调用start方法就会进入 就绪状态。处于就绪状态下的线程随时都可能被系统选择进入运行状态,从而执行线程。可能同时有多个线程处于 就绪状态,对于哪一个线程将进入运行状态是不确定的。线程从新建状态进入到 就绪状态后是不可能再进入新建状态的。在等待/阻塞状态中的线程被解除等待和阻塞后将不直接进入运行状态,而是首先进入准备状态,让系统来选择哪一个线程进入运行状态。
3运行(Running):处于就绪状态中的线程一旦被系统选中,使线程获取了CPU时间,就会进入运行状态。在运行状态中将执行线程类run方法中的程序语句。线程进入运行状态后也不是一执行结束的,线程在运行状态下随时都可能被调度程序调度回准备状态。在运行状态下还可以让线程进入到等待/阻塞状态。在通常的单核CPU中,在同一时刻只有一个线程处于运行状态的。在多核的CPU中,就可能两个线程或者更多的线程同时处于运行状态,这也是多核CPU运行速度快的原因。
4 等待/阻塞(Wait/Blocked):在Java中定义了许多线程调度的方法,包括睡眠、阻塞、挂起和等待,使用这些方法都会将处于运行状态的线程调度到等待/阻塞状态。处于等待/阻塞状态的线程被解除后,不会立即回到运行状态,而是首先进入就绪状态,等待系统的调度。
5 死亡(Dead):当线程中的run方法执行结束后,或者程序发生异常终止运行后,线程会进入死亡状态。处于死亡状态的线程不能再使用start方法启动线程。但是这不代表处于死亡状态的线程不能被使用,它也是可以再被使用的,只是将被作为普通的类来使用。