前言
在Java中,线程是多任务处理的基本单位,它可以并行执行多个任务。线程的状态描述了线程在其生命周期中的不同阶段。Java线程的状态可以分为以下几种:
线程状态
状态 | 解释 |
---|---|
新建状态(New) | 线程被创建但尚未启动 |
就绪状态(Runnable) | 线程已经创建并调用了start()方法,但仍然需要等待CPU的执行时间 |
运行状态(Running) | 线程获得了CPU的执行时间,正在执行任务 |
阻塞状态(Blocked) | 线程因为某些原因被暂停执行,例如等待输入、等待其他线程的锁释放等 |
等待状态(Waiting) | 线程因为等待某个条件满足而暂停执行,例如等待其他线程的通知 |
定时等待状态(Timed Waiting) | 线程因为等待某个条件满足一段指定的时间而暂停执行 |
终止状态(Terminated) | 线程已经执行完任务或因异常而终止 |
这些状态定义在枚举 java.lang.Thread.State
上:
public enum State {NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;
}
很多文章都是指说理论,我这里直接贴代码,运行以下代码就能打印线程的 6
种状态:
public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {Thread t = Thread.currentThread();System.out.println("就绪状态:" + t.getState());LockSupport.park();// 200 毫秒LockSupport.parkNanos(200000000);synchronized (Object.class) {// 空实现即可}});// 让另一个线程获取到锁,这样就能模拟线程1阻塞new Thread(() -> {synchronized (Object.class) {try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {throw new RuntimeException(e);}}}).start();System.out.println("新建状态: " + t1.getState());t1.start();TimeUnit.MILLISECONDS.sleep(100);System.out.println("等待状态: " + t1.getState());LockSupport.unpark(t1);TimeUnit.MILLISECONDS.sleep(100);System.out.println("超时等待状态: " + t1.getState());TimeUnit.MILLISECONDS.sleep(200);System.out.println("阻塞状态: " + t1.getState());TimeUnit.SECONDS.sleep(4);System.out.println("终止状态: " + t1.getState());}
输出结果:
新建状态: NEW
就绪状态:RUNNABLE
等待状态: WAITING
超时等待状态: TIMED_WAITING
阻塞状态: BLOCKED
终止状态: TERMINATED
最后附上线程状态转换图(发现 process on 有比较好的图,直接用了)