现在的位置: 首页 > 综合 > 正文

线程的状态

2012年09月16日 ⁄ 综合 ⁄ 共 891字 ⁄ 字号 评论关闭

一、线程有哪些状态

 
线程的全部状态如下:
 
      born(新生),runnable(可运行),running(运行),waiting(等待),sleeping(睡眠),blocked(阻塞),dead(死亡)。
 
二、状态之间的关系:
当一个Runnable类型对象的构造函数第一次被调用时,一个新的的线程就诞生了。除非我们在构造函数中调用了start方法,否则这个新线程将作为一个新对象呆在内存中基本上什么事情也不做。当我们在构造函数或者main函数中对这个线程调用了start方法,或者这个线程在程序的其他任何位置使他自己的状态由born改变为runnable的线程之后,调度程序就可以把处理器分配给这个线程。
 
把处理器分配给一个处于runnable的线程之后,这个线程的状态就变成了running。如果一个处于running状态的线程能够运行到结束,她的状态就会变为dead。否则,这个线程的命运就取决于当前是否还有其他线程等待处理器运行。如果这个线程在当前所有处于runnable状态的线程中具有最高优先级那么他就就会继续执行,除非这个线程被运行程序的平台划分为时间片。当线程被划分为时间片时,一个处于running状态的线程将分配到一个固定间隔的处理器时间--quantum。具有相同优先级的线程的时间片调度将导致这些线程被轮流执行。如果正在执行的线程的代码包含了yield方法,那么这个处于running状态的线程将停止运行,并把处理器交给其他进程。
 
一个正在运行的线程可以通过调用sleep()方法转换为sleep状态。如果一个线程包含了很长的循环,在循环的每次迭代之后把这个线程切换到sleep状态是一种很好的策略,他可以保证其他线程不必等待很长时间才能轮到处理器执行。当一个正在运行的线程进入到sleep状态时,其中一个等待线程就会切换到处理器。在很长的循环中,我们也可以使用yield方法来代替sleep方法。
 
在run方法的I/O操作期间,处理器无法从一个线程切换到另外一个线程,及时时使用时间片的调度策略也是如此。我们把这种情况称为线程由于I/O操作而阻塞。

抱歉!评论已关闭.