【图】我和她离婚了,却懂了线程的状态图解!!

今天想来聊聊这个线程相关一些见解【图】,很简单,一起来看看!

【图】我和她离婚了,却懂了线程的状态图解!!

 

 

 

 

 

 

 

 

 

 

 

 

 

【图】我和她离婚了,却懂了线程的状态图解!!

 

 

 

 

 

 

 

 

 

 

 

 

 

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的 start()方法。该状态 的线程位于可运行线程池中,变得可运行,等待获取 CPU 的使用权。

3、运行状态(Running):就绪状态的线程获取了 CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃 CPU 使用权,暂时停止运行。 直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

       A、等待阻塞:运行的线程执行 wait()方法,JVM 会把该线程放入等待池中。(wait 会释 放持有的锁)

       B、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则 JVM 会把该线程放入锁池中。

       C、其他阻塞:运行的线程执行 sleep()或 join()方法,或者发出了 I/O 请求时,JVM 会把 该线程置为阻塞状态。当 sleep()           状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕 时,线程重新转入就绪状态。(注意:sleep 是不会释放持有的锁)

5、死亡状态(Dead):线程执行完了或者因异常退出了 run()方法,该线程结束生命周期。 

 

几个重要的方法的区别:

sleep(timeout):当前线程进入阻塞状态,暂停执行一定时间,不会释放锁标记 

join():join()方法会使当前线程等待调用 join()方法的线程结束后才能继续执行 

yield():调用该方法的线程重回可执行状态,不会释放锁标记,可以理解为交出 CPU 时间片, 但是不一定有效果,因为有可能又被马上执行。该方法的真正作用是使具有相同或者更高优 先级的方法得到执行机会。 

wait(timeout):wait 方法通常和 notify()/notifyAll()搭配使用,当前线程暂停执行,会释放锁 标记。进入对象等待池。直到调用 notify()方法之后,线程被移动到锁标记等待池。只有锁 标记等待池的线程才能获得锁