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

yizhihongxing

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日

相关文章

  • 如何重置Win10固定到开始菜单磁贴布局? 恢复初始布局的办法

    如何重置Win10固定到开始菜单磁贴布局?恢复初始布局的办法 如果你想重置Windows 10开始菜单的磁贴布局并恢复到初始状态,你可以按照以下步骤进行操作: 打开开始菜单:点击任务栏左下角的Windows图标或按下Windows键。 进入开始菜单布局编辑模式:在开始菜单中,右键点击任意一个磁贴,然后选择“解锁”选项。这将允许你对开始菜单进行编辑。 重置磁贴…

    other 2023年9月5日
    00
  • Lua中全局变量与非全局环境介绍

    Lua中全局变量与非全局环境介绍 在Lua中,全局变量是在全局环境中定义的变量,可以在程序的任何地方访问。非全局环境是指在特定的作用域中定义的变量,只能在该作用域内访问。 全局变量 全局变量在程序中具有全局范围,可以在任何地方访问。在Lua中,全局变量的定义不需要使用关键字,直接给变量赋值即可。例如: — 定义全局变量 myVariable = 10 –…

    other 2023年7月29日
    00
  • iOS14/iPadOS14 开发者预览 Beta 2 附描述文件下载

    关于“iOS14/iPadOS14 开发者预览 Beta 2 附描述文件下载”的完整攻略,以下是步骤和示例说明: 1. 申请成为开发者 首先,你需要拥有一个苹果开发者账号才能下载开发者预览版的固件和描述文件。如果你还没有成为苹果开发者,需要前往苹果开发者官网进行申请。申请过程很简单,只需要填写一些个人信息并支付一笔费用即可。 2. 下载描述文件 在成为苹果开…

    other 2023年6月26日
    00
  • 深入理解Spring中bean的生命周期介绍

    深入理解Spring中bean的生命周期介绍 在Spring框架中,bean的生命周期是指bean从实例化开始到销毁结束的整个过程。Spring容器管理bean生命周期,保证bean在使用过程中,始终处于一个合适的状态。 bean的生命周期 Spring容器中bean的生命周期可以分为以下几个阶段: 实例化bean Spring容器首先根据配置文件或注解创建…

    other 2023年6月27日
    00
  • 接口自动化测试框架(一):apiautotest框架

    接口自动化测试框架(一):apiautotest框架 在进行软件开发的过程中,接口自动化测试是保证软件质量和项目稳定性的重要环节,减少了测试人员进行测试的工作量,提高了测试效率和测试质量。因此,开发一款易用、高效的接口自动化测试框架就显得尤为重要。 本文介绍的apiautotest框架是一款基于Python语言的接口自动化测试框架,其主要特点包括: 简单易用…

    其他 2023年3月28日
    00
  • 获取控件大小和设置调整控件的位置XY示例

    获取控件大小和设置调整控件位置XY是页面布局中非常重要的操作。下面提供两个示例,分别介绍如何获取控件大小以及如何调整控件的位置。 示例1:获取控件大小 获取控件大小的方法可以通过JavaScript中的offsetWidth和offsetHeight属性来实现。下面是一个示例代码,可以获取DIV控件的宽度和高度: <div id="myDiv…

    other 2023年6月27日
    00
  • C++中list的使用方法及常用list操作总结

    C++中list的使用方法及常用list操作总结 在C++中,list是一个非常常用的STL容器,它能够动态地存储数据,并且对数据的访问、插入、删除等操作都非常高效。本篇文章将介绍C++中list的使用方法及常用list操作的总结。 1. list的定义 在使用list之前,需要包含头文件<list>。list的定义方式如下: #include …

    other 2023年6月27日
    00
  • Java中的private修饰符失效了?

    当我们在Java类中使用private修饰符时,意味着只有该类内部的方法和属性可以访问该字段,而其他任何类(包括该类的子类和同一包内的其他类)都不能访问该字段。但有时我们发现,即使使用了private修饰符,也存在其他类可以访问这个字段的情况。本文将为您解决这一问题。 什么情况下private修饰符会失效? 反射 在Java反射机制中,可以使用getDecl…

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