线程状态与线程方法详解
目录
1. 线程状态介绍
1.1 NEW(新建状态)
1.2 RUNNABLE(可运行状态)
1.3 BLOCKED(阻塞状态)
1.4 WAITING(等待状态)
1.5 TIMED_WAITING(超时等待状态)
1.6 TERMINATED(终止状态)
2. 线程状态转换图
3. 线程常用方法
3.1 线程启动与运行
3.2 线程休眠
3.3 线程等待与唤醒
3.4 线程加入
3.5 线程中断
3.6 线程优先级
3.7 线程礼让
3.8 线程终止
4. 总结
1. 线程状态介绍
在 Java 中,线程的生命周期可以分为多种状态。这些状态定义在 java.lang.Thread.State
枚举类中,具体包括以下六种状态:
1.1 NEW(新建状态)
-
线程被创建但尚未启动。
-
此时线程对象已经存在,但还没有调用
start()
方法。
1.2 RUNNABLE(可运行状态)
-
线程正在 JVM 中执行,或者等待操作系统资源(如 CPU 时间片)。
-
调用
start()
方法后,线程进入 RUNNABLE 状态。
1.3 BLOCKED(阻塞状态)
-
线程因为等待锁而进入阻塞状态。
-
例如,当线程试图获取一个被其他线程持有的锁时,它会进入 BLOCKED 状态。
1.4 WAITING(等待状态)
-
线程无限期地等待其他线程的显式唤醒。
-
调用以下方法会使线程进入 WAITING 状态:
-
Object.wait()
-
Thread.join()
-
LockSupport.park()
-
1.5 TIMED_WAITING(超时等待状态)
-
线程在指定的时间内等待其他线程的唤醒。
-
调用以下方法会使线程进入 TIMED_WAITING 状态:
-
Thread.sleep(long millis)
-
Object.wait(long timeout)
-
Thread.join(long millis)
-
LockSupport.parkNanos(long nanos)
-
LockSupport.parkUntil(long deadline)
-
1.6 TERMINATED(终止状态)
-
线程执行完毕或异常退出。
-
线程的
run()
方法执行完成后,线程进入 TERMINATED 状态。
2. 线程状态转换图
以下是线程状态之间的转换关系:
NEW → RUNNABLE → BLOCKED → RUNNABLE → TERMINATED
↓
WAITING
↓
TIMED_WAITING
3. 线程常用方法
Java 提供了许多方法来操作和控制线程的行为。以下是常用的线程方法及其作用:
3.1 线程启动与运行
-
start()
-
启动线程,使线程进入 RUNNABLE 状态。
-
只能调用一次,重复调用会抛出
IllegalThreadStateException
。
-
-
run()
-
线程的实际执行逻辑。
-
直接调用
run()
不会启动新线程,而是在当前线程中执行。
-
3.2 线程休眠
-
sleep(long millis)
-
使当前线程休眠指定的毫秒数。
-
线程进入 TIMED_WAITING 状态。
-
休眠期间不会释放锁。
-
try {
Thread.sleep(1000); // 休眠 1 秒
} catch (InterruptedException e) {
e.printStackTrace();
}
3.3 线程等待与唤醒
-
wait()
-
使当前线程进入 WAITING 状态,并释放锁。
-
需要其他线程调用
notify()
或notifyAll()
来唤醒。
-
-
notify()
-
随机唤醒一个等待该锁的线程。
-
-
notifyAll()
-
唤醒所有等待该锁的线程。
-
synchronized (lock) {
lock.wait(); // 当前线程等待
lock.notify(); // 唤醒一个等待线程
}
3.4 线程加入
-
join()
-
等待目标线程执行完毕。
-
当前线程进入 WAITING 状态,直到目标线程终止。
-
-
join(long millis)
-
等待目标线程执行完毕,但最多等待指定的毫秒数。
-
Thread thread = new Thread(() -> {
System.out.println("子线程运行");
});
thread.start();
thread.join(); // 主线程等待子线程结束
System.out.println("主线程继续执行");
3.5 线程中断
-
interrupt()
-
中断目标线程。
-
如果线程处于 WAITING 或 TIMED_WAITING 状态,会抛出
InterruptedException
。
-
-
isInterrupted()
-
判断线程是否被中断。
-
-
static interrupted()
-
判断当前线程是否被中断,并清除中断状态。
-
Thread thread = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("线程运行中");
}
System.out.println("线程被中断");
});
thread.start();
thread.interrupt(); // 中断线程
3.6 线程优先级
-
setPriority(int priority)
-
设置线程的优先级(1~10)。
-
优先级越高,线程获得 CPU 时间片的概率越大。
-
-
getPriority()
-
获取线程的优先级。
-
Thread thread = new Thread(() -> System.out.println("线程运行"));
thread.setPriority(Thread.MAX_PRIORITY); // 设置最高优先级
thread.start();
3.7 线程礼让
-
yield()
-
提示调度器当前线程愿意让出 CPU。
-
线程从 RUNNABLE 状态回到就绪状态,让其他线程有机会运行。
-
Thread.yield(); // 当前线程礼让
3.8 线程终止
-
stop()
(已废弃)-
强制终止线程,不推荐使用,因为它可能导致资源未释放。
-
-
推荐方式:
-
使用标志位或
interrupt()
方法来安全地终止线程。
-
class MyThread extends Thread {
private volatile boolean running = true;
@Override
public void run() {
while (running) {
System.out.println("线程运行中");
}
}
public void stopThread() {
running = false;
}
}
MyThread thread = new MyThread();
thread.start();
thread.stopThread(); // 安全终止线程
4. 总结
线程的状态和方法是多线程编程的核心内容。通过理解线程的状态转换和掌握常用的线程方法,可以更好地控制线程的行为,编写出高效、稳定的多线程程序。
-
线程状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。
-
常用方法:
start()
、sleep()
、wait()
、notify()
、join()
、interrupt()
等。