线程的状态
JAVA的6中线程状态:
- NEW : 线程刚刚创建,还没有启动
- RUNNABLE : 可运行状态,由线程调度器可以安排执行。
- 包括READY和RUNNING两种细分状态
- WAITING: 等待被唤醒
- TIMED WAITING: 隔一段时间后自动唤醒
- BLOCKED: 被阻塞,正在等待锁
- TERMINATED: 线程结束
线程状态图
** 线程状态测试代码 **
o.wait() t.join() LockSupport.park() Lock.lock() 这四个方法都是返回waiting状态。
synchronized(o) 返回BLOCKED 状态,看上图所画。
package sc.app.stc.qdm2;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;
/**
* @ClassName ThreadStatus
* @Description 线程状态
* @Date 2022/8/4 10:35
**/
public class ThreadStatus {
public static void main(String[] args) throws Exception {
MyThread myThread = new MyThread();
System.out.println("刚创建的线程状态为"+myThread.getState());
myThread.start();
System.out.println("启动后的线程状态为"+myThread.getState());
myThread.sleep(1000);
System.out.println("隔断时间后自动唤醒的线程状态为"+myThread.getState());
MyThread2 myThread2 = new MyThread2();
myThread2.start();
TimeUnit.SECONDS.sleep(1);
System.out.println("线程锁住后状态为: " + myThread2.getState());
//放开线程
LockSupport.unpark(myThread2);
TimeUnit.SECONDS.sleep(2);
System.out.println("线程解锁后状态为: " + myThread2.getState());
final Object o = new Object();
Thread myThread3 = new Thread(()->{
synchronized (o) {
System.out.println("t3 得到了锁 o");
}
});
new Thread(()-> {
synchronized (o) {
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
TimeUnit.SECONDS.sleep(1);
myThread3.start();
TimeUnit.SECONDS.sleep(1);
System.out.println("线程同步锁状态为: " + myThread3.getState());
}
static class MyThread2 extends Thread {
@Override
public void run() {
try {
//阻塞线程
LockSupport.park();
System.out.println("t2 go on!");
TimeUnit.SECONDS.sleep(1);
}catch (Exception e){
e.printStackTrace();
}
}
}
static class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println();
}
}
}