Java 线程的生命周期完整实例分析
在 Java 中,线程是非常常见的概念。了解线程的生命周期对于正确编写多线程程序是非常重要的。本文将介绍 Java 线程的完整生命周期,并给出两个实例进行说明。
Java 线程的生命周期
Java 线程的生命周期可以归纳为以下 6 个阶段:
- 新建(New):当线程对象被创建后处于新建状态。
- 就绪(Runnable):当调用
start()
方法后,线程处于就绪状态,等待系统分配 CPU 时间片。 - 运行(Running):当系统分配到线程 CPU 时间后,线程处于运行状态。
- 阻塞(Blocked):当线程等待某个条件(如等待输入输出、请求从锁定池中获取对象等)无法继续执行时,线程处于阻塞状态。
- 等待(Waiting):当线程等待某个条件出现时,需要调用
wait()
方法,线程处于等待状态。 - 结束(Terminated):当线程执行完毕或出现异常时,线程处于结束状态。
实例 1
下面是一个简单的线程类例子:
public class MyThread extends Thread {
public void run() {
System.out.println("MyThread running");
}
public static void main(String[] args) {
MyThread thread1 = new MyThread();
System.out.println("Thread status: " + thread1.getState()); // 打印刚创建时的状态
thread1.start();
System.out.println("Thread status: " + thread1.getState()); // 打印线程启动后的状态
}
}
上面的例子中,我们可以看到线程的生命周期包括新建、就绪、运行、结束几个阶段。在 main
方法中,我们首先创建了一个 MyThread
对象,并打印出线程的状态。此时,线程处于新建状态。接着我们调用了 start()
方法启动线程,此时线程处于就绪状态,等待系统分配 CPU 时间片。
我们可以看到,程序的输出如下所示:
Thread status: NEW
Thread status: RUNNABLE
MyThread running
可以看到,在线程启动后,线程的状态变为了运行,并成功执行了 run()
方法。
实例 2
下面是另一个稍微复杂一点的线程类例子:
public class MyThread extends Thread {
public void run() {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MyThread thread1 = new MyThread();
thread1.start();
System.out.println("Thread1 status: " + thread1.getState());
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread1 status: " + thread1.getState());
}
}
上面的例子中,我们重写了 run()
方法。在 run()
方法中,我们让线程休眠 1 秒钟,模拟时间较长的计算。
在 main
方法中,我们首先创建了一个 MyThread
对象,并启动线程。然后,我们打印线程状态,此时线程处于就绪状态。接着,我们让线程休眠 100 毫秒,模拟短暂计算。最后,我们再次打印线程状态,此时线程处于运行状态。
程序的输出如下所示:
Thread1 status: RUNNABLE
Thread1 status: TIMED_WAITING
可以看到,通过休眠操作,我们成功地将线程的状态从就绪转化为了运行,并且在一段时间后将线程的状态转化为了等待状态(由于休眠时间已经超过 1 秒钟,线程结束了)。
结论
通过以上两个实例的演示,我们可以看到线程的生命周期包括新建、就绪、运行、阻塞、等待和结束这几个阶段,了解这些阶段对于正确编写多线程程序是非常重要的。在实际程序中,我们可以根据需要控制线程状态,以达到预期的计算效果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 线程的生命周期完整实例分析 - Python技术站