线程的生命周期分为创建,就绪,运行, 阻塞,销毁5个状态;
1.创建状态:
在使用new关键字创建Thread类的时候,该线程对象就处于新建状态,这个状态一直保持到调用start方法的时候;
2.就绪态:
当调用线程的start方法时,会调用系统的本地方法,系统由运行态切换到内核态,来开辟一个线程,此时线程进入就绪态;
该线程位于就绪队列中等待获取CPU的时间片;
由于创建线程需要由运行态切换到系统内核,这是一个耗时的过程,所以在需要多次创建线程的时候,推荐使用线程池;
3.运行态:
如果就绪态的线程抢夺到了时间片,就可以调用run方法执行该线程的任务,此时该线程由就绪态转变为运行态;
运行态的线程可以通过调用对应的方法转变为阻塞状态,就绪态,和死亡态,这个下节阐述;
4.阻塞态:
如果线程调用sleep等方法,该线程就会由运行态转变为阻塞态,然后在睡眠时间结束之后,就会变为就绪态;
5.死亡态:
一个线程在完成任务或者是其他条件发生的时候,就会切换到死亡态;
杀死一个线程的方法(非自然死亡):
1.使用stop方法强行终止线程,该方法已经被弃用;
调用stop方法会立即停止run方法的执行,包括在catch或finally语句中的操作,并抛出ThreadDeath异常;
因此可能会导致一些清理性的工作得不到完成,如文件,数据库的关闭;
调用stop方法会立即释放线程所持有的所有的锁,导致数据库得不到同步,出现数据不一致的问题;
2.使用推出标志位,使线程退出;
3.使用interrupt方法中断线程;
interrupt方法并不像for循环中的break语句一样,马上就停止循环;调用interrupt方法仅仅在当前线程上打一个停止的标记,并不是真正的停止线程;
也就是说线程并不会立即停止执行,而是什么时候停止完全有线程自行决定;如果中断后,线程立即无条件退出,那么我们会遇到stop方法的老问题;