Java线程生命周期
java.lang.Thread类包含一个静态枚举,它定义了它的潜在状态。在任何给定的时间点内,线程只能处于以下状态之一:
- NEW – 一个新创建的线程,尚未开始执行
- RUNNABLE – 正在运行或准备执行,但它正在等待资源分配
- BLOCKED – 等待获取监视器锁以进入或重新进入同步块/方法
- WAITING – 等待其他线程执行特定操作,无任何时间限制
- TIMED_WAITING – 等待其他线程在指定时间段内执行特定操作
- TERMINATED – 已完成执行
NEW
创建后还没有执行start()方法的线程所处的状态
public static void main(String[] args) {
Thread t = new Thread(() -> {});
System.out.println(t.getState());
}
RUNNABLE
执行start()方法后
public static void main(String[] args) {
Thread t = new Thread(() -> {});
t.start();
System.out.println(t.getState());
}
BLOCKED
public class test3 {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(test3::func);
Thread t2 = new Thread(test3::func);
t1.start();
t2.start();
Thread.sleep(1000);
System.out.println(t2.getState());
}
public static synchronized void func() {
while(true) {
}
}
}
WAITING
比如,线程1创建线程2并执行,如果t1线程执行t2.join(),那么在t2完成前,t1的状态就是waiting
Timed Waiting
当线程等待另一个线程在规定的时间内执行特定操作时,该线程处于TIMED_WAITING
状态。
根据JavaDocs,有五种方法可以将线程置于TIMED_WAITING
状态:
- thread.sleep(long millis)
- wait(int timeout) 或 wait(int timeout, int nanos)
- thread.join(long millis)
- LockSupport.parkNanos
- LockSupport.parkUntil
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("Thread interrupted");
}
});
t1.start();
Thread.sleep(1000);
System.out.println(t1.getState());
}
TERMINATED
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{});
t1.start();
Thread.sleep(1000);
System.out.println(t1.getState());
}