线程的生命周期
新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)五种状态。
1. 新建(New)
当创建Thread类的一个实例对象时,此线程进入新建状态(未被启动)
例如:Thread t1 = new Thread();
2. 就绪(Runnable)
线程已经被启动,正在就绪队列中排队等候得到CPU资源。
例如:t1.start();
注意:
- 启动线程:使用start()方法,而不是run()方法
- 只能对处于新建状态的线程调用start()方法,否则将引发IllegalThreadStateException异常。
3. 运行(Running)
线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。
线程谦让:Thread.yield()
public static native void yield();
注意:
一旦执行,让出CPU,当前线程让出CPU后,还会进行CPU资源的争夺,但是否被分配到就不一定了。
应用:
如果一个线程不那么重要,或者优先级非常低,而且又害怕它会占用太多的CPU资源,则可以在适当的时候调用Thread.yield()
4. 阻塞(Blocked)
正在运行的线程让出CPU并暂停自己的执行,即进入阻塞状态。
有两种方式:
- 正在睡眠:调用sleep(long t)方法
- 正在等待:调用wait()方法
注意:
线程从阻塞状态只能进入就绪状态,无法进入运行状态。
5. 死亡(Dead)
当线程执行完毕或被其他线程杀死,线程就进入死亡状态。
有三种方式:
- run()或call()方法执行完毕,线程正常结束。
- 线程抛出一个未捕获的Exception或Error
- 调用该线程的stop()方法来结束该线程(容易导致死锁,不推荐使用)
线程状态转换