线程状态的定义
线程对象在不同的运行时期有不同的状态,这些状态就定义在java.lang.Thread.State
枚举类中
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
线程状态的解释
- 尚未启动的线程处于
NEW
状态 - 在JVM中执行的线程处于
RUNNABLE
状态 - 受阻塞并 等待某个监视器锁的线程处于
BLOCKED
状态 - 等待另一个线程来执行某一特定操作的线程处于
WAITING
状态 - 等待另一个线程来执行取决于指定等待时间的操作的线程处于
TIMED_WAITING
状态 - 已退出的线程处于
TERMINATED
状态
验证线程状态
- NEW
Thread t = new Thread();
System.out.println(t.getState());
Thread
对象在创建后,没有调用start
方法前,其状态为NEW
- RUNNABLE
Thread t = new Thread(()-> System.out.println(Thread.currentThread().getState()));
t.start();
调用start
方法后,线程在执行时,其状态为RUNNABLE
- TERMINATED
Thread t = new Thread();
TimeUnit.SECONDS.sleep(1);
System.out.println(t.getState());
线程执行结束后,其状态为TERMINATED
- BLOCKED
public class BlockedTest {
public synchronized static void service(){
System.out.println(Thread.currentThread().getName() + "进入业务方法");
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{service();});
Thread t2 = new Thread(()->{service();});
t1.setName("T1");
t2.setName("T2");
t1.start();
TimeUnit.SECONDS.sleep(1);
t2.start();
TimeUnit.SECONDS.sleep(1);
System.out.println("T2 状态" + t2.getState());
}
}
线程T1
执行后,获得了锁,在T2
执行时,发现锁已经被占用,所以出于等待状态,所以在最后输出时,T2
的状态为BLOCKED
- WAITING
public class WaitThread {
public static final Object lock = new Object();
public static void main(String[] args) {
Thread t = new Thread(()-> {
try {
synchronized (lock){
lock.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
t.start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(t.getState());
}
}
当前线程中的锁对象执行了wait
方法之后,线程就处于WAITING
状态,如果线程中的锁对象想执行了wait(long timeout)
,线程就处于TIMED_WAITING
状态