线程状态
6个状态定义:java.lang.Thread.State
public static enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
private State() {
}
}
- NEW:尚未启动的线程的线程状态
- RUNNABLE:可运行线程的线程状态,等待CPU调度
- BLOCKED:线程阻塞等待监视器锁定的线程状态
- WAITING:等待线程的线程状态,不带超时的。方式有:Object.wait、Thread.join、LockSupport.park
- TIMED_WAITING:具有指定等待时间的等待线程的线程状态。方式有:Thread.sleep、Object.wait、Thread.join、LockSupport.parkNanos、LockSupport.parkUntil
- Terminated:终止线程的线程状态,即线程正常完成执行或者出现异常
线程状态图解:
从代码端查看线程状态:
第一种状态切换: 新建 -> 运行 -> 终止
输出:
第二种状态切换: 新建 -> 运行 ->等待 ->运行 -> 终止 (sleep方式)
输出:
第三种状态切换: 新建 -> 运行 ->阻塞 ->运行 -> 终止
输出:
完整代码:
package com.java_foundation.Thread;
/**
* @program: java_foundation
* @description: 多线程运行状态切换实例
* @author: xiongbangwen <Email>xiongbangwen@163.com</Email>
* @create: 2020-06-06 15:38
**/
public class ThreadDemo_1 {
public static Thread thread;
public static ThreadDemo_1 obj;
public static void main(String[] args) throws InterruptedException {
//第一种状态切换: 新建 -> 运行 -> 终止
System.out.println("====== 第一种状态切换: 新建 -> 运行 -> 终止 ======");
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread1当前的状态: " + Thread.currentThread().getState().toString());
System.out.println("thread1执行了" );
}
});
System.out.println("没调用start方法,thread1当前状态: " + thread1.getState().toString());
thread1.start();
Thread.sleep(2000L);//等待thread1执行结束,再看状态
System.out.println("等待两秒后,thread1当前状态: " + thread1.getState().toString());
//thread1.start(); 注意:线程终止之后,再进行调用会抛出IllegalThreadStateException异常
System.out.println();
System.out.println("------------------------------------------------------");
System.out.println();
//第二种状态切换: 新建 -> 运行 ->等待 ->运行 -> 终止 (sleep方式)
System.out.println("====== 第二种状态切换: 新建 -> 运行 ->等待 ->运行 -> 终止 (sleep方式) ======");
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
try {//将线程2移动到等待状态,1.5s后自动唤醒
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread2当前的状态: " + Thread.currentThread().getState().toString());
System.out.println("thread2执行了" );
}
});
System.out.println("没调用start方法,thread2当前状态:" + thread2.getState().toString());
thread2.start();
System.out.println("调用了start方法,thread2当前状态:" + thread2.getState().toString());
Thread.sleep(200L);//等待0.2秒再看状态
System.out.println("等了0.2秒后,thread2状态:" + thread2.getState().toString());
Thread.sleep(3000L);//等待3秒再看状态
System.out.println("等了3秒后,thread2状态:" + thread2.getState().toString());
System.out.println();
System.out.println("------------------------------------------------------");
System.out.println();
//第三种状态切换: 新建 -> 运行 ->阻塞 ->运行 -> 终止
System.out.println("====== 第三种状态切换: 新建 -> 运行 ->阻塞 ->运行 -> 终止 ======");
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (ThreadDemo_1.class) {
System.out.println("thread3当前的状态: " + Thread.currentThread().getState().toString());
System.out.println("thread3执行了");
}
}
});
synchronized (ThreadDemo_1.class) {
System.out.println("没调用start方法,thread3当前状态:" + thread3.getState().toString());
thread3.start();
System.out.println("调用了start方法,thread3当前状态:" + thread3.getState().toString());
Thread.sleep(200L);//等待0.2秒再看状态
System.out.println("等了0.2秒后,thread3状态:" + thread3.getState().toString());
}
Thread.sleep(3000L);//等待3秒再看状态
System.out.println("等了3秒后,thread3状态:" + thread3.getState().toString());
}
}