java线程的6种状态:
NEW: 线程刚刚创建,还未启动
RUNNABLE: 可运行状态,线程调度器可以调度该线程来执行
WAITING: 等待被唤醒的状态
TIMED WAITING: 隔一段时间后自动唤醒
BLOCKED: 被阻塞,正在等待锁的释放
TERMINATED: 线程结束,消亡。
解释:
上图箭头所指方向为状态迁移方向,黑实线上标注的为可触发状态迁移的方式。
特殊说明:
TIMED WAITING:等待一段时间后会结束,然后进入RUNNABLE状态,WAITING:就是盲等的意思,需要你去唤醒才能进入RUNNABLE状态,调用线程的t.yield()方法,就是暂时让出一下下cpu的时间片,但可能还会被自己抢到cpu的执行权力;RUNNABLE 分 READY和 RUNNNG
线程状态验证测试1:
/**
* 线程状态验证测试1
*/
public class TestThread {
@SneakyThrows
public static void main(String[] s){
Thread t1 = new Thread(()->{
System.out.println("2: "+Thread.currentThread().getState());//RUNNABLE 状态
for (int i = 0;i < 3; i++){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t1: "+i);//线程运行内容输出
}
System.out.println();
});
System.out.println("1: "+t1.getState());//NEW 状态
t1.start();//启动线程
t1.join(1);
System.out.println("3: "+t1.getState());//TERMINATED 状态
}
}
线程状态验证测试1日志输出:
1: NEW
2: RUNNABLE
t1: 0
t1: 1
t1: 2
3: TERMINATED
Process finished with exit code 0
线程状态验证测试2:
/**
* 线程状态验证测试2
*/
public class TestThread {
@SneakyThrows
public static void main(String[] s){
Thread t2 = new Thread(()->{
try {
LockSupport.park();//挂起当前t2线程
System.out.println("t2 go on...");
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
t2.start();
TimeUnit.SECONDS.sleep(1);
System.out.println("1: "+t2.getState());// WAITING 状态
LockSupport.unpark(t2);//唤醒t2线程
TimeUnit.SECONDS.sleep(1);
System.out.println("2: "+t2.getState());//TIMED_WAITING 状态
}
}
线程状态验证测试2日志输出:
1: WAITING
t2 go on...
2: TIMED_WAITING
Process finished with exit code 0
线程状态验证测试3:
/**
* 线程状态验证测试3
*/
public class TestThread {
@SneakyThrows
public static void main(String[] s){
final Object obj = new Object();
//第一个线程
Thread t3 = new Thread(()->{
synchronized (obj){
System.out.println("t3 得到了 obj 锁");
}
});
//第二个线程
new Thread(()->{
synchronized (obj){
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
TimeUnit.SECONDS.sleep(1);
t3.start();
TimeUnit.SECONDS.sleep(1);
System.out.println(t3.getState());
//BLOCKED 此时t3线程获取不到锁,所以就是阻塞状态 BLOCKED,需要等待锁的释放
}
}
线程状态验证测试3日志输出:
BLOCKED
t3 得到了 obj 锁
Process finished with exit code 0