状态简介
thread源码中可以找到枚举状态:
| 线程状态 | 导致状态发生条件 |
|---|---|
| New (新建) | 线程刚被创建,但是并未启动,还没调用 start 方法,只有线程对象,没有线程特征 |
| Runnable (可运行) | 线程可以在 java 虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器,调用了 t.start() 方法:就绪(经典叫法) |
| Blocked (锁阻塞) | 当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入 Blocked 状态;当该线程持有锁时,该线程将变成 Runnable 状态 |
| Waiting (无限等待) | 一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入 Waiting 状态,进入这个状态后不能自动唤醒,必须等待另一个线程调用 notify 或者 notifyAll 方法才能唤醒 |
| Timed Waiting (计时等待) | 有几个方法有超时参数,调用将进入 Timed Waiting 状态,这一状态将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有 Thread.sleep 、Object.wait |
| Teminated (被终止) | run 方法正常退出而死亡,或者因为没有捕获的异常终止了 run 方法而死亡 |
代码实现
新建-New
public void newState(){ThreadDemo1 t = new ThreadDemo1();System.out.println(t.getState());//NEW}
可运行-Runnable
public void runnableState(){Thread t = new Thread(()->{for (int i=0 ;i<1000;i++) {}});t.start();System.out.println(t.getState());//RUNNABLE}
阻塞-Blocked
public void blockedState() {Object o = new Object();Thread t1 =new Thread(() -> {synchronized (o) {try {Thread.sleep(1000*10);} catch (InterruptedException e) {e.printStackTrace();}}});Thread t2 =new Thread(() -> {synchronized (o) {System.out.println("t2");}});t1.start();try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}t2.start();System.out.println(t1.getState()); // TIMED_WAITINGSystem.out.println(t2.getState()); // BLOCKED}
无限等待-Waiting
Thread t1 = new Thread(()->{while(true) { // runnable}});Thread t2 = new Thread(()->{try {t1.join(); // waiting} catch (InterruptedException e) {e.printStackTrace();}});
计时等待-Timed_Waiting
Thread t4 = new Thread("t4") {@Overridepublic void run() {synchronized (TestState.class) {try {Thread.sleep(1000000); // timed_waiting} catch (InterruptedException e) {e.printStackTrace();}}}};
被终止-Teminated
Thread t3 = new Thread("t3") {@Overridepublic void run() {log.debug("running...");}};
