Java 线程的生命周期详细介绍及实例代码

Java 线程是 Java 编程中一个非常重要的概念。线程的生命周期指的是一个线程从被创建到最终死亡的整个过程,在这个过程中,线程会经历不同的阶段。

线程的生命周期

Java 线程的生命周期分为 6 个阶段,分别是:

  1. 新建状态(New): 当一个线程对象被创建后,它就处于新建状态。此时,线程没有被系统启动,它不具有执行的能力。

  2. 就绪状态(Runnable): 当一个线程调用 start() 方法后,该线程就处于就绪状态。此时,线程具有了执行的能力,只是还没有被启动执行。此时,线程会被加入就绪队列中,等待系统进行调度。

  3. 运行状态(Running): 当线程调度器选择了一个线程,使它进入运行状态时,它才真正开始执行。处于运行状态的线程可以转换到就绪状态或者阻塞状态。

  4. 阻塞状态(Blocked): 当一个正在执行的线程被挂起时,它就处于阻塞状态。在阻塞状态下,线程不会占用 CPU 资源,因此也不会消耗系统资源。线程被唤醒后,将会回到就绪状态。

  5. 等待状态(Waiting): 线程进入等待状态时,它将不会被分配 CPU 时间,也不会运行任何代码。在等待状态下,线程只会等待某些条件的发生,例如,等待其他线程的执行结果或者等待某个对象锁的释放。

  6. 死亡状态(Terminated): 当线程的 run() 方法执行完毕,或者出现了异常而没有被处理时,线程进入死亡状态。

Java 线程的示例说明

示例一

下面是一个 Java 线程的代码示例:

public class MyThread extends Thread {
   public void run() {
      System.out.println("线程运行中...");
   }

   public static void main(String args[]) {
      MyThread thread = new MyThread();
      thread.start();
   }
}

在这个示例中,我们创建了一个继承自 Thread 类的子类 MyThread,该子类重载了 run() 方法。在 main 方法中,我们创建了 MyThread 的实例并调用了 start() 方法。在这个过程中,MyThread 的状态从 new 变为了 Runnable,然后进入运行状态,执行了 run() 方法中的代码。

示例二

下面是一个 Java 线程等待的示例代码:

class WaitNotifyDemo {
   public void testWait() throws InterruptedException {
      synchronized (this) {
         System.out.println(Thread.currentThread().getName() + "线程开始执行...");
         wait();
         System.out.println(Thread.currentThread().getName() + "线程等待结束...");
      }
   }

   public void testNotify() throws InterruptedException {
      Thread.sleep(1000);
      synchronized (this) {
         System.out.println(Thread.currentThread().getName() + "线程开始执行...");
         notify();
         System.out.println(Thread.currentThread().getName() + "线程执行结束...");
      }
   }

   public static void main(String[] args) {
      WaitNotifyDemo demo = new WaitNotifyDemo();

      new Thread(new Runnable() {
         @Override
         public void run() {
            try {
               demo.testWait();
            } catch (InterruptedException e) {
               e.printStackTrace();
            }
         }
      }, "等待线程").start();

      new Thread(new Runnable() {
         @Override
         public void run() {
            try {
               demo.testNotify();
            } catch (InterruptedException e) {
               e.printStackTrace();
            }
         }
      }, "通知线程").start();
   }
}

在这个示例中,我们创建了 WaitNotifyDemo 类,并实现了两个测试方法 testWait() 和 testNotify()。在主线程中,我们分别启动了等待线程和通知线程。在等待线程中,我们使用 synchronized 来加锁,并调用 wait() 方法让线程等待状态;在通知线程中,我们也使用 synchronized 来加锁,并调用 notify() 方法来通知等待线程。

在等待线程开始执行后,它会进入等待状态。在通知线程执行完毕后,它会唤醒等待线程并让它执行。在这个过程中,等待线程的状态会经历从 Runnable 转换为 Waiting,然后再转换为 Runnable。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 线程的生命周期详细介绍及实例代码 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • ppt怎么制作创意的loading加载动画?

    当制作PPT演示文稿时,一个令人难忘的颜色、醒目的文本排版和清晰的图像是非常重要的。但是,如果你要在你的PPT中添加一个创意的loading加载动画,你需要知道如何做。 以下是PPT制作创意的loading加载动画的完整攻略: 步骤1:选择合适的loading加载动画 要为你的PPT选择创意的loading加载动画,你需要从几个不同的选项中选择,这些选项包括…

    other 2023年6月25日
    00
  • HTTP长连接与短连接使用方法及测试详解

    HTTP长连接与短连接使用方法及测试详解 一、概述 HTTP(超文本传输协议)是一种基于TCP/IP协议的传输协议。与TCP连接的建立和关闭需要时间,如果每一次请求都要重新建立连接,频繁的三次握手可能会浪费大量的时间和带宽。 HTTP长连接和短连接在HTTP协议中必须要重点讨论的问题。长连接和短连接是指客户端和服务器建立的TCP连接的存活时间。 二、长连接和…

    other 2023年6月27日
    00
  • 解读C++11 原生字符串

    下面是“解读C++11 原生字符串”的完整攻略: 什么是C++11原生字符串? C++11中引入了一种新的字符串类型,叫做原生字符串(Raw String)。它不需要转义字符,可以包含任何字符,包括换行符等特殊字符。 举个例子,我们来看一下使用传统字符串和原生字符串表示同样的字符串的区别。 传统字符串: cout << "Hello\t…

    other 2023年6月20日
    00
  • Go语言安装和GoLand2021最全超详细安装教程

    Go语言安装和GoLand2021最全超详细安装教程 本攻略将详细介绍如何安装Go语言和GoLand 2021,并提供两个示例说明。 安装Go语言 首先,访问Go语言官方网站(https://golang.org/dl)下载适用于您操作系统的Go语言安装包。 打开下载的安装包,并按照安装向导的指示进行安装。在Windows上,您只需双击安装包并按照提示进行操…

    other 2023年8月8日
    00
  • js利用与或运算符优先级实现if else条件判断表达式

    在 JavaScript 中,可以使用与或运算符(&& 和 ||)来实现条件判断表达式。主要思路是利用与或运算符的优先级和短路特性来实现。 && 运算符的优先级高于 || 运算符,因此 && 运算符会先被执行。当 && 运算符的左边表达式为 true 时,会继续执行右边表达式;当左边表达式为 f…

    other 2023年6月27日
    00
  • Android如何在Gradle中更改APK文件名详解

    如果你想在构建Android工程时修改APK文件名,可以通过以下方式实现: 步骤1:打开build.gradle文件 在你的Android工程目录下,打开build.gradle文件,一般有两个文件,一个是app/build.gradle,另一个是project/build.gradle。我们需要修改的是app/build.gradle文件。 步骤2:添加如…

    other 2023年6月26日
    00
  • 用注册表优化NTFS 提高计算机系统性能

    标题:使用注册表优化NTFS提高计算机系统性能 介绍:NTFS是Windows操作系统上常用的文件系统之一,优化NTFS可以提高计算机系统的性能。本文将详细讲解如何使用注册表来优化NTFS。 步骤一:备份注册表 在编辑注册表前,务必备份注册表以防止不可预知的错误。具体步骤如下: 点击Windows菜单,输入“regedit”打开注册表编辑器。 选择“文件”-…

    other 2023年6月27日
    00
  • word红头文件、公文的排版技巧

    关于“word红头文件、公文的排版技巧”,以下是我的建议: 1. 红头文件的制作 1.1 使用word模板 制作红头文件的一种常见方式是使用word模板。你可以下载一份现成的红头文件模板,并根据自己的需求进行修改。在编辑模板时,你必须注意以下几点: 合理安排版面:模板中应包含机关或单位名称、文件名称、时间、页码等项目。 选择合适字体:一般来说,红头文件中的字…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部