线程状态的转换(java.lang.Thread.State 里面有 6 种线程状态):

 

 

yarn add 和yarn的区别_yarn add 和yarn的区别

 

 

yarn add 和yarn的区别_yarn add 和yarn的区别_02

 

1、NEW 状态
用 new Thread() 建立一个线程对象后,该线程对象就处于 NEW 状态。

2、RUNNABLE 状态
通过调用线程的 start() 进入 RUNNABLE 状态。
在操作系统层面,对 RUNNABLE 状态还有细分,按是否有获得 CPU 的控制权分为:READY 和 RUNNING 状态。

2.1  READY 状态
处于 READY 状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(就绪池),等待系统为其分配CPU。

注:如果希望子线程调用 start() 方法后立即执行,可以使用Thread.sleep()方式使主线程睡眠一伙儿,转去执行子线程。

2.2 RUNNING 状态线程处于运行状态。这个状态最为复杂,它也可和其他状态进行转化,转化的示意图如上图。

注: 在运行状态的线程调用 yield(),它就会让出cpu资源,再次变为就绪状态。

 

3. WAITING 状态
线程进入等待状态

 

4. TIMED_WAITING 状态
超时等待状态。
注:处于 TIMED_WAITING  状态的线程,除了等待超时时间到后结束等待外,还可以通过调用相应的唤醒方法:notify(),notifyAll(),unpark(),来强制唤醒等待的线程。(测试通过)

5、BLOCKED 状态
当线程在等待获取对象监视器锁,从而进入 synchronized 方法(或synchronized 块)时,线程就处于 BLOCKED 状态。(具体可以查看 Thread.State#BLOCKED 的注释)

6、TEMINATED 状态
当线程的 run() 执行完,或者被强制性地终止,例如出现异常,或者调用了stop()、desyory()方法等等,就会从运行状态转变为死亡状态。
线程一旦死亡,就不能复生。如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

 

Note: 

 

守护线程

守护线程与普通线程写法上基本么啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程。

setDaemon方法的详细说明:
public final void setDaemon(boolean on)将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。该方法必须在启动线程前调用。

实际上:JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态,因此,在使用后台线程(守护线程)时候一定要注意这个问题。

守护线的好处就是你不需要关心它的结束问题。例如你在你的应用程序运行的时候希望播放背景音乐,如果将这个播放背景音乐的线程设定为非守护线程,那么在用户请求退出的时候,

不仅要退出主线程,还要通知播放背景音乐的线程退出;如果设定为守护线程则不需要了。

 

如何结束一个线程

Thread.stop()、Thread.suspend、Thread.resume、Runtime.runFinalizersOnExit这些终止线程运行的方法已经被废弃了,使用它们是极端不安全的!

想要安全有效的结束一个线程,只要保证在一定的情况下,run方法能够执行完毕即可。而不是while(true)的无线循环。

有些时候线程的run()方法不能正常的执行完毕(可能在运行时转成了阻塞),这种情况下可以借助Thread对象的interrupt()方法将中断状态设置为true来结束一个线程。

当一个线程处于sleep、wait、join这三种状态之一的时候,如果此时他的中断状态为true,那么它就会抛出一个InterruptedException的异常,并将中断状态重新设置为false。

 

我们看看sleep、wait、join方法的声明:

public final void wait() throws InterruptedException  
public static native void sleep(long millis) throws InterruptedException  
public final void join() throws InterruptedException

可以看到,这三者有一个共同点,都抛出了一个InterruptedException的异常。所以,我们可以使用interrupt这个巧妙的方式结束掉这种情况下的线程。