立即学习:https://edu.csdn.net/course/play/29000/424234?utm_source=blogtoedu
1、线程的生命周期
线程启动 并不是立马运行
java线程中 6种:NEW,运行状态(就绪状态+运行状态 二者可以根据CPU调度变化),阻塞状态(WAITING+TIMED_WAITING+BLOCKED),终止状态
操作系统层面 5种:运行状态(就绪状态+运行状态 二者可以根据CPU调度变化),阻塞状态(WAITING+TIMED_WAITING+BLOCKED),终止状态
阻塞: WAITING、TIMED_WAITING、BLOCKED、IO阻塞
如何导致 WAITING?:sleep;wait();join;LockSupport.park
如何导致TIMED_WAITING?:sleep(long);wait(long);join(long);LockSupport.park(long)
如何导致 BLOCKED?:Synchronized
为什么线程启动后,不是立马运行状态,而是就绪状态?
因为,线程启动后,需要操作系统调度算法来分配CPU,这个阶段是就绪状态,分配结束后进入运行阶段
2、线程的启动
new Thread().start() 启动一个线程=》通过调用native start0 C语言的方法,调用JVM层面的启动线程的方法;我们要知道一个知识点 线程是操作系统提供的
new Thread().run() 调用实例方法
3、线程的终止
3.1、线程什么情况终止?
(1) run() 方法执行结束
(2)interrupt() 不是强制中断的方法, 不能正常结束的run()方法,才使用interrupt();或者中断 处于sleep(long)的线程
while(!Thread.currentThread().isInterrupted()){
}
1》还有一种判断是否能使用 interrupt()方法的必要条件那就是 看看代码中是否抛出了 InterruptedException 异常处理,如果catch(InterruptedException e)的异常处理中没有抛出异常throw出去,那是不会中断线程的,会触发线程复位,使interrupted变成false,如果把捕获的异常抛出去报错,才会中断线程
2》举个类似的例子?
try{
}catch(InterruptedException e){
e.printStackTrace();//不作处理 不中断
throw new RuntimeException();//强制结束,该干活了
Thread.currentThread().interrupt();//再次中断;//别睡觉了,接下来是否工作不知道
}
午休期间,在一直在睡觉(while循环),闹钟响了(interrupter()方法),如果选择关闭闹钟没有干活(不对异常做处理),那就继续睡;如果立马起身工作(抛出异常,告诉你该干活了),则睡眠中断;或者闹钟响后,重新设置闹钟模式,持续响(也就是在catch中 持续再次中断 Thread.currentThread().interrupt()),那么肯定睡不成觉了,会保持清醒,但是是否开始干活就不一定了
3》什么是复位?如何复位?为什么要复位?
复位就是 将线程变为初始化状态,interrupted 变为false;
复位的方法 thread.interrupt();
需要复位的原因:中断可能不合理,如果在不合理的情况下中断了,没进行复位,那线程就进行不下去了,所以中断后 要复位,这样如果针对中断(InterruptedException)没抛出异常或者再次中断,那样代码while()就可以继续下去了,所以复位的最终目的就是防止误杀
4》interrupt()作用?
(1)设置一个共享变量的值为true
(2) 唤醒处于阻塞状态下的线程