线程的状态:
-
初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
-
运行(RUNNABLE):处于可运行状态的线程正在JVM中执行,但它可能正在等待来自操作系统的其他资源,例 如处理器。
-
阻塞(BLOCKED):线程阻塞于synchronized锁,等待获取synchronized锁的状态。
-
等待(WAITING):Object.wait()、join()、
LockSupport.park(),进入该状态的线程需要等待其他线程做出一些特 定动作(通知或中断)。 -
超时等待(TIME_WAITING):
Object.wait(long)
、Thre
ad.join()、LockSupport.parkNanos()
、LockSupport.parkUntil
,该状态不同于WAITING,它可以在指定的时间内自行返回。 -
终止(TERMINATED):表示该线程已经执行完毕。
线程状态的示例代码:
1、初始(NEW) 调用start方法前new Thread的状态
package com.cljtest.demo;
public class ThreadDemo {
public static void main(String[] args) {
Thread thread = new Thread();
}
}
2、运行(RUNNABLE)
public class ThreadDemo {
public static void main(String[] args) {
Thread thread = new Thread(()->{
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
});
thread.start();
}
}
可以使用jconsole查看线程状态
3. 阻塞(BLOCKED)和4. 4. 等待(WAITING)
public class ThreadDemo {
public static void main(String[] args) throws InterruptedException {
//waiting
Object obj = new Object();
Thread thread = new Thread(()->{
synchronized (obj){
try {
Thread.sleep(1000000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
//将主线程短暂的休眠
Thread.sleep(2000L);
//block
Thread thread2 = new Thread(()->{
synchronized (obj){
}
});
thread2.start();
}
}
线程一进入waitting状态,线程二进入block状态
5. 超时等待(TIME_WAITING):
public class ThreadDemo {
public static void main(String[] args) throws InterruptedException {
//waiting
Object obj = new Object();
Thread thread = new Thread(() -> {
synchronized (obj) {
try {
obj.wait(100000000000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
}
}
各线程状态间的相互转换及关系,整理如下图所示: