学习笔记(33):第1章 分布式基础之并发编程-了解多线程的意义和使用(下)

立即学习: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) 唤醒处于阻塞状态下的线程

猜你喜欢

转载自blog.csdn.net/qq_28500837/article/details/112859744