线程的生命周期
线程状态
新建
(new Thread) 创建一个空对象的线程,在这时可以通过Thread类的方法来设置线程各种属性
,如线程的 优先级(setPrioity),线程名(setName),和线程的类型(setDaemon)等
线程的类型 -->守护线程和后台线程 后台线程随守护线程结束而结束,垃圾回收器就是守护线程.
就绪
start()启动线程后,系统为该线程分配了除CPU外的所有资源,使该线程处于就绪状态,
此外,如果某个线程执行了yield()方法,那么该线程会被暂时剥夺CPU资源,重新进入就绪状态
运行(活动)
通过调度选中一个处于就绪的状态的线程,使其占有CPU资源并转为运行状态,此时,系统正真执行run()方法
注:可以通过Thread类的isAlive方法来判断线程是就绪/运行状态 是的话返回true,返回false是可能线程处于阻塞或者停止状态
阻塞和唤醒
正在运行的 线程因为某些原因不能继续运行,就进入阻塞
原因:1.当执行了某个线程的sleep()等阻塞类型的 方法,该线程对象会被置于一个阻塞及内 ,等待超时而自动苏醒
2.当多个线程视图进入某个同步区域(synchronized)时,没能进入该同步区域的线程会被置于锁定集(LockPool)
直到获得该同步区域的锁进入就绪状态
3.当线程执行了某个对象wait()方法时,线程会被置于该对象的等待集(WaitPool)中,直到执行了该对象的notify()方法,
wait()/notify()方法的执行要求线程首先获得该对象的锁
死亡
线程在run()方法执行结束后进入死亡状态,此外,如果线程执行了interrupt()或stop()方法
那么它会以异常退出的方式进入死亡状态
这五种状态都可以通过Thread里面方法控制
终止线程的三种方法
- 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止,推荐使用
- 使用stop()方法强行终止线程(这个方法不推荐使用,因为stop和suspend,resume一样的也可能发生不可预料的结果)
- 使用interrupt()方法中断线程