线程有个相对来说比较复杂的生命周期
他的生命周期是怎样的呢?:
新建状态
(New):new Thread,调用start()方法之后才会是运行在JVM中的一个线程。就绪状态
(Runable):也就是说具备了执行的能力,并不意味着就能够执行。运行状态
(Running):当被分配到CPU执行权后后。阻塞状态
(Blocked):在运行的过程中有可能发生 block,或者你要增加锁、调用 wait()方法都会 block 住。阻塞之后不能立即回到运行状态,必须先到就绪状态,包括sleep的时候,还有就是运行的过程中CPU把执行权交给了其她的线程,这时就不能去运行了,会短暂的休息。因为多个进程多个线程之间切换是由CPU去做的,只不过是她的速度非常块看不出来而已,你以为她是同时跑了很多东西。
- 纳秒级或者微秒级的速度就看不出来有影响,但是对CPU的调度来说她每一个时间点只能执行一个任务
终结状态
(Terminated):正常完成后、在sleep、wait、抢锁时被打断了,或者就绪状态的过程中出现意外都会进入终结状态。这就是大致的生命周期:在new Thread对象之后调用start()方法,她不会立即去执行也有可能立即去执行,然后变成就绪状态,正常运行完成之后就正常的死亡。如果在运行的过程中调用了sleep()方法、wait()方法、增强锁,她可能就会block 住,block之后不能立即回到运行状态,他必须先回到就绪状态,这时候跟CPU要执行权,CUP呢Dispatch之后变成运行状态,如果在block过程中,有其他线程对这个线程进行了中断,这个线程就有可能也进入了死亡状态。还有在就绪的过程中有可能由于一些平台、操作系统的问题也会导致线程的终止或死亡。