图文并茂学"并发编程" - 线程的几种状态及其切换
程序员文章站
2022-05-04 20:56:30
...
线程的几种状态
- 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
- 运行(RUNNABLE):处于可运行状态的线程正在JVM中执行,但它可能正在等待来自操作系统的其他资源,例如处理器。
- 阻塞(BLOCKED):线程阻塞于synchronized锁,等待获取synchronized锁的状态。
- 等待(WAITING):Object.wait()、join()、 LockSupport.park(),进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
- 超时等待(TIMED_WAITING):Object.wait(long)、Thread.join()、LockSupport.parkNanos()、LockSupport.parkUntil,该状态不同于WAITING,它可以在指定的时间内自行返回。
- 终止(TERMINATED):表示该线程已经执行完毕。
线程几种状态代码演示
RUNNABLE状态
public class ThreadStateDemo {
public static void main(String[] args) {
//TODO 演示线程处于RUNNABLE状态
new Thread(()->{
try {
//让线程保持RUNNABLE状态,等待键盘输入
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
},"Thread-1").start();
}
}
cmd窗口输入jconsole,打开 Java监视和管理控制台
,查看ThreadStateDemo类
中,Thread-1线程
状态
BLOCK状态和TIMED_WAITING状态
public class ThreadStateDemo {
public static void main(String[] args) throws InterruptedException {
Object obj = new Object();
//TODO 演示线程处于TIMED_WAITING状态
new Thread(()->{
synchronized (obj){
try {
Thread.sleep(1000000000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"Thread-1").start();
//让主线程休眠2毫秒,保证Thread-1先执行先占有锁obj
Thread.sleep(2L);
//TODO 演示线程处于BLOCK状态
new Thread(()->{
synchronized (obj){
}
},"Thread-2").start();
}
}
使用jconsole查看控制窗口
Thread-1 等待 Thread.sleep(1000000000L) 执行结束,处于超时等待状态
Thread-2 等待 Thread-1 释放锁,处于阻塞状态
线程状态之间的转换
列举简单的几种状态转换:
状态1:创建 --》执行 --》终止
线程从创建到执行最后结束,是所有线程都会经历的
状态2:创建 --》执行 --》阻塞 --》执行 --》终止
线程从创建到执行,如果线程内部获取不到synchronized锁,线程就会处于阻塞状态,获取锁后线程回到执行状态,直到执行结束
状态3:创建 --》执行 --》超时等待 --》执行 --》终止
线程从执行到创建,如果线程内部发生类似于 Thread.sleep(1000000000L) 这样的操作,线程就会进入超时等待状态,直到sleep执行结束,线程回到执行状态,最后线程执行结束