JAVA -- 线程生命周期

在Java中,线程的生命周期描述了线程从创建到终止的整个过程。

在Java中,线程的生命周期可以分为六种状态:新建状态(New)、可运行状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)、等待状态(Waiting)、计时等待状态(Timed Waiting)和终止状态(Terminated)。线程从新建状态开始,通过调用start()方法进入可运行状态,等待调度器选择运行。运行状态的线程可能因等待锁或I/O操作进入阻塞状态,或通过调用wait()join()等方法进入等待状态。计时等待状态的线程在指定时间后自动恢复。线程的run()方法执行完毕或因异常终止时,线程进入终止状态。

1. 新建状态(New)

当一个线程对象被创建时,它处于新建状态。此时,线程还没有开始执行。

Thread myThread = new Thread(); // 新建状态

2. 可运行状态(Runnable)

当调用线程的start()方法时,线程进入可运行状态。在这个状态下,线程已经准备好运行,但具体何时运行由线程调度器决定。

myThread.start(); // 可运行状态

3. 运行状态(Running)

线程调度器选择一个可运行状态的线程并让它运行时,该线程进入运行状态。在这个状态下,线程的run()方法正在执行。

4. 阻塞状态(Blocked)

线程在某些情况下会进入阻塞状态,例如等待获取一个锁、等待输入/输出操作完成等。阻塞状态的线程不会占用CPU时间。

synchronized (lock) { // 可能进入阻塞状态
    // 代码
}

5. 等待状态(Waiting)

线程可以通过调用Object.wait()Thread.join()LockSupport.park()等方法进入等待状态。等待状态的线程需要其他线程显式地唤醒。

synchronized (lock) {
    lock.wait(); // 进入等待状态
}

6. 计时等待状态(Timed Waiting)

线程可以通过调用带有超时参数的方法进入计时等待状态,例如Thread.sleep(long millis)Object.wait(long timeout)Thread.join(long millis)等。计时等待状态的线程在指定时间后会自动恢复到可运行状态。

Thread.sleep(1000); // 进入计时等待状态

7. 终止状态(Terminated)

线程的run()方法执行完毕或因未捕获的异常而终止时,线程进入终止状态。此时,线程的生命周期结束,不能再被重新启动。

public void run() {
    // 线程执行代码
} // 线程进入终止状态

状态转换图

以下是Java线程状态转换的示意图:

[New] --start()--> [Runnable] --调度--> [Running]
  |                  |
  |                  |--sleep()/wait(timeout)--> [Timed Waiting]
  |                  |
  |                  |--wait()/join()--> [Waiting]
  |
  |--run()完成或异常--> [Terminated]

示例代码

public class ThreadLifecycleExample {
    public static void main(String[] args) {
        Thread myThread = new Thread(() -> {
            try {
                System.out.println("Thread is running.");
                Thread.sleep(1000); // 进入计时等待状态
                synchronized (ThreadLifecycleExample.class) {
                    ThreadLifecycleExample.class.wait(); // 进入等待状态
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        myThread.start(); // 进入可运行状态

        try {
            Thread.sleep(500); // 主线程进入计时等待状态
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        synchronized (ThreadLifecycleExample.class) {
            ThreadLifecycleExample.class.notify(); // 唤醒等待的线程
        }
    }
}

总结

  • 新建状态(New):线程对象被创建,但尚未启动。
  • 可运行状态(Runnable):线程调用start()方法后进入可运行状态,等待调度器选择运行。
  • 运行状态(Running):线程调度器选择一个可运行状态的线程并让它运行。
  • 阻塞状态(Blocked):线程在等待获取锁或进行I/O操作时进入阻塞状态。
  • 等待状态(Waiting):线程通过调用wait()join()等方法进入等待状态,需要其他线程唤醒。
  • 计时等待状态(Timed Waiting):线程通过调用带有超时参数的方法进入计时等待状态,在指定时间后自动恢复。
  • 终止状态(Terminated):线程的run()方法执行完毕或因异常终止,线程进入终止状态。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值