线程的状态转换及线程调度

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

线程在它的生命周期中会处于各种不同的状态:
新建、就绪、运行、阻塞、死亡。
1 新建
用new语句创建的线程对象处于新建状态,此时它和其他java对象一样,仅被分配了内存。
2就绪
当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态。处于这个状态的线程位于Java虚拟机的可运行池中,等待cpu的使用权。
3 运行状态
处于这个状态的线程占用CPU,执行程序代码。在并发运行环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程处于这个状态。
只有处于就绪状态的线程才有机会转到运行状态。
4 阻塞状态
阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才会有机会获得运行状态。
5 死亡状态
当线程执行完run()方法中的代码,或者遇到了未捕获的异常,就会退出run()方法,此时就进入死亡状态,该线程结束生命周期。

关于主线程
当Java程序启动时,一个线程立刻运行,该线程通常叫做程序的主线程。
主线程的重要特性体现在下面两个方面
1. 它是产生其它子线程的线程
2. 通常必须最后完成执行,因为要执行各种关闭动作
一个Java程序在执行时会首先创建一个主线程main线程,因此如果在程序中创建了n个线程,则程序中共有n+1个线程
对于一个线程对象start方法只能被执行一次,如果
对同一线程对象多次执行start方法,JVM将抛出:
IllegalThreadStateException

所谓多线程的并发运行,其实就是指各个线程轮流获得CPU的使用权,分别执行各自的任务。而线程何时获得CPU的使用权是由Java虚拟机说了算的。
Java虚拟机的一项任务就是负责线程的调度。线程的调度是指按照特定的机制为多个线程分配CPU的使用权。有两种调度模型:1 分时调度模型 2 抢占式调度模型。
分时调度模型是让所有线程轮流获得CPU的使用权,并且平均分配每个线程占用的CPU的时间片。
java虚拟机采用抢占式调度模型,它是指优先让可运行池中优先级高的线程占用CPU,如果可运行池中线程的优先级相同,那么就随机的选择一个线程,使其占用CPU。处于运行状态的线程会一直占有CPU运行,直至它不得不放弃CPU。一般有下面3个原因:
1 java虚拟机让当前线程暂时放弃cpu 转到就绪状态,使其他线程获得运行机会
2 当前线程因为某些原因而进入阻塞状态
3 线程运行结束
值得注意的是,线程的调度不是跨平台的。
它不仅取决于java虚拟机,还依赖于操作系统。
在某些系统中,只要运行的线程没有遇到阻塞,就不会放弃CPU,在某些系统

中,即使没有遇到阻塞,也会运行一段时间后放弃CPU,给其他线程运行的机会。

由于java线程调度不是分时的,如果程序希望干预java虚拟机对线程的调度过程,从而明确地让一个线程给另外一个线程运行的机会,可以采用以下的方法
1 调整各个线程的优先级
2 让处于运行状态的线程调用Thread.sleep(long time)方法 放弃CPU 进入阻塞状态
sleep方法可能抛出InterruptedException
3 让处于运行状态的线程调用Thread.yield()方法 只会同优先级让步或更高优先级让步 进入就绪状态
4 让处于运行状态的线程调用另一个线程的join()方法
当前运行的线程可以调用另一个线程的join()方法,当前运行的线程将转到阻塞状态,直至另一个线程运行结束,它才会转到就绪状态 从而有机会恢复运行。

相关文档
最新文档