Java 线程状态流转

背景

Java 中一个线程是一段执行程序,JVM 允许一个应用程序中多个线程并发执行。

线程具有优先级,高优先级的线程 先于 低优先级的执行,每个线程创建时可以设置为守护线程和优先级。创建线程有两个方法,一种是 继承Thread类,另一种是 实现 Runnable接口。

调用线程的start()方法来执行线程,start()为同步方法,一个线程不能启动多次

状态

 NEW: 线程创建完成未启动

RUNNABLE:可运行状态,可能正在执行中,也可能等待cpu分配资源

BLOCKED: 阻塞状态,等待监视器锁定时被阻止的状态,调用synchronized 同步块或方法;或者调用wait之后重新进入 Synchronized 同步块或方法

WAITING:等待状态,调用 Object.wait,Thread.join,LockSupport.park 方法进入等待状态;

另一个线程可以用Object.notify或 Object.notifyAll 唤起wait的线程,Thread.join只能等待指定线程结束,LockSupport.unpark 

TIMED_WAITING:具有等待时间的等待状态,调用以下方法进入该状态;

Thread.sleep(1000)、Object.wait(1000)、 Thread.join(1000)、LockSupport.parkNanos(1000)、LockSupport.parkUntil(1000) ; 等待时间完毕进入runnable状态

TERMINATED:终止,线程执行完毕

参考:Java线程状态转换

Java线程状态

https://my.oschina.net/goldenshaw/blog/386788

https://my.oschina.net/goldenshaw/blog/705397

https://my.oschina.net/goldenshaw/blog/706663

https://my.oschina.net/goldenshaw/blog/802620

https://my.oschina.net/goldenshaw/blog/806018

注:为什么必须在同步的方法/块内调用wait(),notify(),notifyAll()

1、一个线程调用一个对象A的wait()之后,就需要另外一个线程来调用A的notify() 来唤醒,这样的成对使用是一种线程间的通讯

2、另一方面 wait()操作的调用一定是到达某种特定状态来,而这种特定状态是由其他线程 调用notify(),notifyAll() 向外发出的 已到达特定状态的信号。该状态是线程之间的通信信道,并且是 共享可变状态。

3、Synchronize 保证多线程状态下 ,只有一个线程来操作 wait(),notify(),notifyAll(),任意意时刻只能被唯一的一个获得了对象实例锁的线程调用

参考:

阿里巴巴面试题: 为什么wait()和notify()需要搭配synchonized关键字使用

为什么必须在同步的方法/块内调用wait(),notify(),notifyAll()

你可能感兴趣的:(Java 线程状态流转)