【线程的生命周期】

简介: 【线程的生命周期】

线程的生命周期

线程生命周期指的是一个线程从被创建到运行到结束的整个过程。一般来说,线程生命周期包括以下几个阶段:

  1. 新建状态(New):当一个线程被创建时,它处于新建状态。此时系统分配了线程所需的资源,但线程还没有开始运行。
  2. 就绪状态(Runnable):当线程的 start() 方法被调用时,线程进入就绪状态。此时线程已经准备好了运行,但还没有分配到 CPU 资源。
  3. 运行状态(Running):当线程获得了 CPU 资源,它就进入运行状态。此时线程开始执行自己的代码,直到遇到阻塞、等待或者被中断等情况。
  4. 阻塞状态(Blocked):当线程需要等待某个事件发生时,它会进入阻塞状态。例如,当调用 Thread.sleep() 方法或者等待 I/O 完成时,线程就会进入阻塞状态。
  5. 等待状态(Waiting):当线程等待某个条件满足时,它会进入等待状态。例如,调用 Object.wait() 方法时,线程会等待其他线程调用 notify() 或者 notifyAll() 方法来唤醒它。
  6. 定时等待状态(Timed Waiting):和等待状态类似,但是可以设置等待的时间。例如,调用 Thread.sleep() 或者带有超时参数的 Object.wait() 方法时,线程会进入定时等待状态。
  7. 终止状态(Terminated):当线程执行完毕或者出现异常时,它就进入终止状态。

下面是一个简单的示例程序,演示线程的生命周期:

public class ThreadLifecycleDemo {
    public static void main(String[] args) {
        // 创建线程对象
        Thread thread = new Thread(() -> {
            System.out.println("线程开始执行");
            try {
                Thread.sleep(1000);  // 线程进入定时等待状态
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程执行完毕");
        });
        // 打印线程状态
        System.out.println("线程当前状态:" + thread.getState());
        // 启动线程
        thread.start();
        // 等待线程执行完毕
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 打印线程状态
        System.out.println("线程当前状态:" + thread.getState());
    }
}

输出结果如下:

线程当前状态:NEW
线程开始执行
线程执行完毕
线程当前状态:TERMINATED

可以看到,线程会依次进入新建状态、就绪状态、运行状态、定时等待状态和终止状态。在示例程序中,我们使用 join() 方法等待线程执行完毕后再打印线程状态,这样可以确保我们看到的状态是最终状态。

小故事

有一个小故事叫做“小明和他的线程”,它可以帮助我们了解线程的生命周期。

小明是一位程序员,他正在开发一个在线游戏。在游戏中,他需要有一个线程来处理用户的输入。所以,他创建了一个线程,并给它取名叫“输入处理线程”。

第一阶段:创建(New)

当小明创建了输入处理线程,线程就进入了创建阶段。在这个阶段,操作系统为线程分配了必要的资源,例如内存和CPU时间。

第二阶段:就绪(Runnable)

一旦输入处理线程被分配了必要的资源,它就可以进入就绪状态。在就绪状态中,线程准备好运行,但是它还没有被调度为运行状态。此时,操作系统会把线程放到就绪队列中,等待CPU的调度。

第三阶段:运行(Running)

当操作系统将输入处理线程从就绪队列中调度出来,并分配了CPU时间,线程就可以进入运行状态。在运行状态中,线程会执行它的任务,例如处理用户输入。

第四阶段:阻塞(Blocked)

有时候,线程执行任务时会被阻塞,例如等待一个网络请求或者等待一个锁。在这种情况下,线程会进入阻塞状态,直到它的任务可以继续执行。

第五阶段:终止(Terminated)

当线程完成了它的任务或者发生了一个致命错误,线程就会进入终止状态。在终止状态中,线程释放了它所占用的资源,并且不再运行。

在小明的例子中,当输入处理线程完成了处理用户输入的任务,它就会进入终止状态。然后,小明可以重新创建一个新的线程来处理下一个用户输入。


目录
打赏
0
0
0
0
75
分享
相关文章
|
9月前
|
【编程侦探社】追踪 Java 线程:一场关于生命周期的侦探故事!
【6月更文挑战第19天】在Java世界中,线程如同神秘角色,编程侦探揭示其生命周期:从新生(`new Thread()`)到就绪(`start()`),面临并发挑战如资源共享冲突。通过`synchronized`实现同步,处理阻塞状态(如等待锁`synchronized (lock) {...}`),最终至死亡,侦探深入理解并解决了多线程谜题,成为编程侦探社的传奇案例。
43 1
Java 线程的生命周期
在JDK 1.5之前,线程的生命周期包括五种状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。JDK 1.5及之后增加了三种阻塞状态,共六种状态:新建、可运行、终止、锁阻塞、计时等待和无限等待。这些状态描述了线程在操作系统和JVM中的不同阶段。
129 4
Java 线程的生命周期
|
5月前
|
[Java]线程生命周期与线程通信
本文详细探讨了线程生命周期与线程通信。文章首先分析了线程的五个基本状态及其转换过程,结合JDK1.8版本的特点进行了深入讲解。接着,通过多个实例介绍了线程通信的几种实现方式,包括使用`volatile`关键字、`Object`类的`wait()`和`notify()`方法、`CountDownLatch`、`ReentrantLock`结合`Condition`以及`LockSupport`等工具。全文旨在帮助读者理解线程管理的核心概念和技术细节。
58 1
[Java]线程生命周期与线程通信
|
9月前
|
深入解析Java线程状态与生命周期
深入解析Java线程状态与生命周期
50 1
|
4月前
线程的生命周期
线程的生命周期包括以下状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、死亡(Dead)。 线程控制: sleep():使线程暂停指定时间。 join():等待线程终止。 yield():让出CPU执行权给其他线程。
|
5月前
|
Java一个线程的生命周期详解
Java中,一个线程的生命周期分为五个阶段:NEW(新建),RUNNABLE(可运行),BLOCKED(阻塞),WAITING(等待),TERMINATED(终止)。线程创建后处于新建状态,调用start方法进入可运行状态,执行中可能因等待资源进入阻塞或等待状态,正常完成或异常终止后进入终止状态。各状态间可相互转换,构成线程的生命周期。
127 9
【多线程面试题 五】、 介绍一下线程的生命周期
线程的生命周期包括新建、就绪、运行、阻塞和死亡状态,线程状态会根据线程的执行情况在这些状态之间转换。
【多线程面试题 五】、 介绍一下线程的生命周期
线程的状态和生命周期
在多线程编程中,线程的状态和生命周期是两个非常重要的概念。了解线程的状态和生命周期可以帮助我们更好地理解和编写多线程程序。
75 4
|
9月前
|
【技术瑜伽师】Java 线程:修炼生命周期的平衡之道,达到多线程编程的最高境界!
【6月更文挑战第19天】Java多线程编程犹如瑜伽修行,从创建线程开始,如`new Thread(Runnable)`,到启动线程的活跃,用`start()`赋予生命。面对竞争与冲突,借助同步机制保证资源访问的有序,如`synchronized`关键字。线程可能阻塞等待,如同瑜伽的静止与耐心。完成任务后线程终止,整个过程需密切关注状态变换,以求多线程间的和谐与平衡。持续修炼,如同瑜伽般持之以恒,实现高效稳定的多线程程序。
42 3
|
9月前
|
【代码诗人】Java线程的生与死:一首关于生命周期的赞歌!
【6月更文挑战第19天】Java线程生命周期,如诗般描绘了从新建到死亡的旅程:创建后待命,`start()`使其就绪,获得CPU则运行,等待资源则阻塞,任务完或中断即死亡。理解生命周期,善用锁、线程池,优雅处理异常,确保程序高效稳定。线程管理,既是艺术,也是技术。
35 3
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等