在 Java 中,线程是一种轻量级的执行单元,能够并发地执行多个任务。Java 线程具有多个状态,在不同状态间切换,接下来我们即将介绍这些状态.
线程状态 | 解释 |
---|---|
NEW | 尚未启动的线程状态,即线程创建,还未调用start方法 |
手机 | 就绪状态(调用start,等待调度)+正在运行 |
RUNNABLE | 就绪状态(调用start,等待调度)+正在运行 |
BLOCKED | 等待监视器锁时,陷入阻塞状态 |
WAITING | 等待状态的线程正在等待另一线程执行特定的操作(如notify) |
TERMINATED | 线程完成执行,终止状态 |
当然java的线程状态,简单来说说的话,就是如下图所示的:
当然要精细一些的话,就应该就是下面这个完整的流程流程图了,这幅图源自《Java并发编程艺术》
了解完这个基本的流程图之后,我们就可以具体的来介绍java的这几种状态,究竟是怎么回事.
即用new关键字新建一个线程,这个线程就处于新建状态。
代码如下:
Thread thread = new Thread(); // 创建一个 Thread 对象
Thread thread = new Thread(() -> {// 线程要执行的任务
});
thread.start(); // 调用 start() 方法,线程进入运行状态
阻塞(Blocked)状态:当线程等待某个条件满足时,它会进入阻塞状态,比如等待一个锁、等待 I/O 操作完成等
synchronized (lock) { // 获得锁// 线程要执行的任务
} // 释放锁
等待(Waiting)状态:当线程等待另一个线程的通知或信号时,它会进入等待状态,比如调用 Object.wait() 方法时。
synchronized (lock) {while (!condition) {lock.wait(); // 等待条件满足}
}
计时等待(Timed Waiting)状态:当线程等待一个具有超时时间的操作时,它会进入计时等待状态,比如调用 Thread.sleep() 方法或 Object.wait(long timeout) 方法时。
try {Thread.sleep(1000); // 线程休眠 1 秒
} catch (InterruptedException e) {e.printStackTrace();
}
终止(Terminated)状态:当线程执行完任务后,它会进入终止状态。
Thread thread = new Thread(() -> {// 线程要执行的任务
});
thread.start(); // 调用 start() 方法,线程进入运行状态
// 等待线程执行完任务
try {thread.join(); // 等待线程执行完任务
} catch (InterruptedException e) {e.printStackTrace();
}
// 线程已经执行完任务,进入终止状态