Java 之 线程的生命周期(一)
来源:互联网 发布:js urldecode解码 编辑:程序博客网 时间:2024/06/04 23:21
当线程被创建并启动以后,它既不是已启动就进入执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。尤其是当线程启动以后,它不可能一直“霸占”这CPU独自运行,所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、就绪之间切换。
新建和就绪状态
当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时它和其他的Java对象一样,仅仅由Java虚拟机为其分配内存,并初始化其成员变量的值。此时的线程对象没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体。
当线程对象调用了start方法之后,该线程处于就绪状态,Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行了。至于该线程合适开始运行,取决于JVM里线程调度器的调度。
启动线程使用start方法,而不是run方法!永远不要调用线程的run方法!调用start方法来启动线程,系统会把该run方法当成线程执行体来处理;但如果直接调用线程对象的run方法,则run方法立即就会被执行,而且在run方法返回之前其他线程无法并发执行--也就是说,如果直接调用线程对象的run方法,系统把线程对象当成一个普通对象,而run方法也是一个普通方法,而不是线程执行体。
public class FourthThread extends Thread {private int i;//重写run方法,run方法的方法体就是线程执行体public void run(){for ( ; i < 10; i++) {//直接调用run方法时,Thread的this.getName()返回的是该对象的名字System.out.println(Thread.currentThread().getName() + " " + i);}}public static void main(String[] args)throws Exception{for (int i=0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + " " + i);if (i==5) {//直接调用线程对象的run方法//系统会把线程对象当成普通对象,把run方法当成普通方法//所以下面两行代码并不会启动两个线程,而是一次执行两个run方法new FourthThread().run();new FourthThread().run();}}}}
启动线程的正确方法时调用Thread对象的start方法,而不是直接调用run方法,否则就变成单线程程序了。调用了线程的run方法之后,该线程已经不再处于新建状态,不要再次调用线程对象的start方法(只能对处于新疆状态的线程调用start的方法,否则将引发IllegalThreadStateException异常)。调用线程对象的start方法之后,该线程立即进入就绪状态--就绪状态相当于“等待执行”,但该线程并未真正进入运行状态。
如果希望调用子线程的start方法后子线程就立即开始执行,程序可以使用Thread.sleep(1)来让当前运行的线程(主线程)睡眠1毫秒,因为在这1毫秒内CPU不会空闲,它会去执行另一个处于就绪状态的线程,这样就可以让子线程立即开始执行。
- Java 之 线程的生命周期(一)
- Java 之 线程的生命周期(二)
- Java 之 线程的生命周期(三)
- Java学习笔记之线程(一):线程的创建和生命周期
- Java学习笔记之线程的生命周期
- java多线程之线程的生命周期
- JAVA线程的生命周期
- Java线程的生命周期
- JAVA线程的生命周期
- java 线程的生命周期
- java线程的生命周期
- Java线程的生命周期
- Java线程的生命周期
- Java线程的生命周期
- Java线程的生命周期
- java--线程的生命周期
- java线程的生命周期
- JAVA:线程的生命周期
- 基于ZigBee和STM32的智能家居控制系统的设计与实现(四)
- Python学习备忘3
- Qt模仿360系统托盘
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- 802.11协议中的一些帧的理解
- Java 之 线程的生命周期(一)
- Java一些知识点的总结
- 基于.net开发chrome核心浏览器【一】
- C语言函数调用中堆栈知识
- js代码加总结
- java静态方法学习小结
- Qt中QString与数字类型的转换方法
- 1088. Rational Arithmetic (20)
- 微信硬件平台从入门到精通(服务器端)