主页 > 人工智能  > 

线程状态与线程方法详解

线程状态与线程方法详解

目录

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() 等。

标签:

线程状态与线程方法详解由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“线程状态与线程方法详解