爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      Java中Thread类的基本认识与使用(如果想知道Java中有关Thread类的基本知识,那么只看这一篇就足够了!)

      首页 知识中心 软件开发 文章详情页

      Java中Thread类的基本认识与使用(如果想知道Java中有关Thread类的基本知识,那么只看这一篇就足够了!)

      2025-03-05 09:08:19 阅读次数:11

      Java,Thread,创建,状态,线程

              前言:在Java中,Thread类是实现多线程编程的核心。它允许程序同时执行多个任务,提高应用程序的响应能力和性能。通过Thread类,开发者可以轻松创建和管理线程,并实现复杂的并发操作。接下来,我们将探讨Thread类的基本用法及其在实际开发中的应用。

      在开始讲解并查集之前,先让我们看一下本文大致的讲解内容

      Java中Thread类的基本认识与使用(如果想知道Java中有关Thread类的基本知识,那么只看这一篇就足够了!)

      1.Java中线程的回顾

              线程是程序中执行代码的最小单位,通常被称为执行流。每个线程都有自己独立的运行路径,并且可以与其他线程并行执行代码。多个线程共享同一进程的资源,比如内存空间和文件句柄,但它们之间可以独立调度。

              ——这就像在现实生活中,我们有多个员工(线程)在公司(进程)里同时工作,虽然他们共享办公空间和资源,但每个人都有各自的任务要完成。

              在程序中,线程能够提高并发性,处理多任务,减少等待时间。线程的概念可以通过如下的代码理解:

      public class ThreadDemo {
          private static class MyThread extends Thread {
              @Override
              public void run() {
                  System.out.println(Thread.currentThread().getName() + "正在运行");
              }
          }
      
          public static void main(String[] args) {
              MyThread t1 = new MyThread();
              MyThread t2 = new MyThread();
      
              t1.start(); // 启动第一个线程
              t2.start(); // 启动第二个线程
          }
      }
      

              在这个例子中,MyThread 类继承了 Thread,我们通过 start() 方法启动了两个线程 t1 和 t2,它们分别执行各自的任务。线程可以独立运行,即使它们共享相同的进程资源。

              

              ——所以我们为什么需要线程来帮助我们工作呢?

              多线程编程的需求主要来自两个方面:提高多核CPU的利用率 和 处理I/O等待问题。

      1. 提高多核CPU的利用率 随着硬件的发展,CPU的单核性能提升遇到了瓶颈,现代的计算机通常采用多核CPU。为了充分利用这些多核资源,程序需要能够并行处理多个任务,这时多线程编程就成为了一个关键手段。例如,如果一个程序能够同时在多个CPU核心上运行不同的线程,整体计算效率就会成倍提升。

      2. 解决I/O等待问题 有时,程序需要等待某些耗时的I/O操作(如文件读写或网络请求)完成,而在等待这些操作时,CPU的资源可能会被浪费掉。通过引入多线程,程序可以在等待I/O时继续执行其他任务,从而提高整体效率。就像在餐馆里,厨师可以同时准备多道菜,而不是等待每道菜完成后再开始下一个。

              这里我们在使用一个日常生活中的例子来进行理解:

              假设你在银行办理业务,需要分别处理财务转账、员工福利发放、社保缴纳。如果只有一个员工来处理所有这些事务,他需要排队等候多个业务完成,这会拖慢整个流程。而如果每个业务都有专门的员工负责,它们可以同时进行,显著提高效率。这就是多线程在程序中的表现。

             ——通过上述的回顾,我相信读者已经可以回想起有关Java中线程的内容了!!!

       

      2.Thread线程的五种创建方式

              回顾完有关Java中线程的知识之后,让我们正式的开始本篇文章的主要内容,那么一开始,让我们先看一下在Java中如何去创建一个线程,其有以下五种创建方式:

              (1)继承 Thread 类创建线程

              这是最直接的方式,通过继承 Thread 类并重写其 run() 方法来定义线程的执行逻辑。Thread 类本身实现了 Runnable 接口,因此每个 Thread 对象都可以被当作一个线程。通过调用 start() 方法,线程会开始运行,操作系统的线程调度器会选择适当的时机执行 run() 方法中的代码。

      class MyThread extends Thread {
          @Override
          public void run() {
              System.out.println("线程 " + Thread.currentThread().getName() + " 正在执行");
          }
      }
      
      public class ThreadExample {
          public static void main(String[] args) {
              MyThread thread1 = new MyThread(); // 创建线程对象
              thread1.start(); // 启动线程
          }
      }
      

      该种方式创建线程的优点:

      • 简单直观,适合需要对线程本身进行自定义控制的场景

      该种方式创建线程的缺点:

      • Java 不支持多继承,如果线程类已经继承了其他类,就不能再继承 Thread 类,因此这种方式具有局限性。

       

              (2)实现 Runnable 接口创建线程

              相比继承 Thread 类,实现 Runnable 接口 是更灵活的方式,因为它解耦了线程的任务与线程对象本身。通过实现 Runnable 接口并将其传递给 Thread 对象,我们可以实现类似的功能。这种方式尤其适合在需要继承其他类时使用。

      class MyRunnable implements Runnable {
          @Override
          public void run() {
              System.out.println("线程 " + Thread.currentThread().getName() + " 正在执行");
          }
      }
      
      public class RunnableExample {
          public static void main(String[] args) {
              MyRunnable myRunnable = new MyRunnable();
              Thread thread = new Thread(myRunnable); // 创建线程对象并传入 Runnable 对象
              thread.start(); // 启动线程
          }
      }
      

      该种方式创建线程的优点:

      • 线程任务与线程对象分离,符合面向接口编程的原则。

      • 适用于需要继承其他类的场景,更加灵活。

      该种方式创建线程的缺点:

      • 与直接继承 Thread 相比,代码稍显复杂,需要额外的 Runnable 对象。

       

              (3)使用匿名内部类创建 Thread 子类对象

              为了简化代码,Java 提供了匿名内部类的方式来创建线程对象。这种方式通过定义一个匿名子类并重写 run() 方法,可以在一行代码中同时创建线程并指定其任务。匿名内部类适合用于短小的、一次性的线程任务。

      public class AnonymousThreadExample {
          public static void main(String[] args) {
              // 使用匿名类创建 Thread 子类对象
              Thread thread = new Thread() {
                  @Override
                  public void run() {
                      System.out.println("匿名类线程 " + Thread.currentThread().getName() + " 正在执行");
                  }
              };
              thread.start(); // 启动线程
          }
      }
      

      该种方式创建线程的优点:

      • 代码简洁,适合一次性任务,避免创建额外的类文件。

      该种方式创建线程的缺点:

      • 可读性较差,特别是对于复杂任务时,不易维护。

      • 由于是匿名类,不能复用或扩展其功能。

       

              (4)使用匿名内部类创建 Runnable 子类对象

              类似于匿名 Thread 子类的方式,匿名内部类 也可以用于创建 Runnable 对象,然后将其传递给 Thread。这种方式依然能够通过实现 Runnable 接口来定义线程任务,并保持代码简洁

      public class AnonymousRunnableExample {
          public static void main(String[] args) {
              // 使用匿名类创建 Runnable 子类对象
              Runnable myRunnable = new Runnable() {
                  @Override
                  public void run() {
                      System.out.println("匿名类 Runnable 线程 " + Thread.currentThread().getName() + " 正在执行");
                  }
              };
              
              Thread thread = new Thread(myRunnable); // 创建并启动线程
              thread.start();
          }
      }
      

      该种方式创建线程的优点:

      • 灵活且代码简洁,能够避免创建多余的类文件。

      • 线程任务与 Thread 对象分离,保持了良好的代码结构。

      该种方式创建线程的缺点:

      • 可读性较差,对于复杂任务的实现不够清晰。

      • 匿名内部类不能被复用。

       

              (5)使用 Lambda 表达式创建线程

              在 Java 8 之后,Lambda 表达式大大简化了代码的书写。当任务逻辑较为简单时,可以用 Lambda 表达式代替匿名内部类来实现 Runnable 接口。Lambda 表达式使代码更简洁、易读,同时避免了不必要的语法冗余。

      public class LambdaThreadExample {
          public static void main(String[] args) {
              // 使用 Lambda 表达式创建 Runnable 对象
              Thread thread = new Thread(() -> {
                  System.out.println("Lambda 线程 " + Thread.currentThread().getName() + " 正在执行");
              });
      
              thread.start(); // 启动线程
          }
      }
      

      该种方式创建线程的优点:

      • 代码极其简洁,尤其适合简单的线程任务。

      • 提升代码的可读性,减少样板代码的编写。

      该种方式创建线程的缺点:

      • 仅适用于 Java 8 及以上版本。

      • 不适合需要大量逻辑或复杂任务的场景。

              ——以上就是Java中创建线程的五种方式了!!!

       

      3.多线程的状态与调度

              了解了Java中的线程如何去创建之后,现在让我们深入Java中的Thread类,看看其状态和其如何去调度的。

              (1)线程状态

              了解完了如何在Java中去创建一个线程之后,在让我们看一下Java中的线程的状态以及调度,在Java中,线程的生命周期可以分为五种状态:

      1. NEW(新建状态):线程对象被创建,但尚未调用 start() 方法,此时线程还未开始运行。

      2. RUNNABLE(可运行状态):线程已经调用 start() 方法,进入就绪队列,等待CPU的调度,或者正在运行中。

      3. BLOCKED(阻塞状态):线程等待获取锁时处于阻塞状态。比如当线程试图进入一个 synchronized 块但锁被其他线程占用时,它就会进入 BLOCKED 状态。

      4. WAITING(等待状态):线程主动等待某个条件的触发,比如调用了 wait() 方法,等待其他线程调用 notify()。

      5. TERMINATED(终止状态):线程执行完毕或被异常终止,此时线程已经结束运行。

      这里我们使用一段代码来对线程的状态进行控制并打印其状态:

      public class ThreadStateDemo {
          public static void main(String[] args) throws InterruptedException {
              Thread thread = new Thread(() -> {
                  for (int i = 0; i < 1000000; i++) { /* 模拟任务执行 */ }
              });
      
              System.out.println("线程状态:" + thread.getState());  // NEW
              thread.start();
              while (thread.isAlive()) {
                  System.out.println("线程状态:" + thread.getState());  // RUNNABLE
              }
              System.out.println("线程状态:" + thread.getState());  // TERMINATED
          }
      }
      

              在这个代码中,线程 thread 在不同时刻有不同的状态:NEW 表示线程刚刚创建,RUNNABLE 表示线程正在运行,TERMINATED 表示线程已经执行完毕(读者可能不太理解其中的方法,不管美食,读者只要根据该代码对上述的线程状态进行理解即可)。

       

              (2)线程调度

              线程的调度由操作系统的线程调度器管理,Java中的线程调度是抢占式的,这意味着线程的执行顺序由系统决定,而不是由程序直接控制。操作系统会根据线程的优先级、系统负载等因素来决定哪个线程获得CPU的时间片。

              因此,线程的执行顺序是不确定的,这也是为什么在多线程编程中会出现一些竞争问题,后面我们将进一步讨论。

              这样我们就了解了有关多线程的状态与调度了。

       

      4.Thread类的属性及基本方法的使用

              通过上述的讲解,我们相信读者已经对Java中的线程有了初步的理解了,那么现在开始,我们就开始学习Java中Thread类的属性和操作Java中线程的方法了。

              【1】Thread类的基本属性

              在Java中 Thread 类有一些重要的属性,它们用于表示和控制线程的状态和行为,理解这些属性有助于更好地调试和优化多线程程序,以下是 Thread 类中的几个常见属性:

              (1)线程 ID(ID)

              每个线程都有一个唯一的ID,表示线程的标识符。这个ID是系统自动分配的,且不同线程的ID永远不会重复。线程ID用于唯一标识每个线程,无论线程是否运行,ID都可以帮助我们区分不同的线程。开发者可以通过 getId() 方法获取线程的ID:

      long id = thread.getId();
      System.out.println("线程 ID: " + id);

              线程ID主要用于低级别的系统操作或调试,它是线程的唯一标识符,不能被更改。

       

              (2)线程名称(Name)

              线程名称是开发者可以手动指定的属性。通过设置有意义的名称,开发者可以在调试或日志中快速定位某个线程的执行情况。线程的名称可以在创建时指定,也可以在运行过程中通过 setName() 方法更改:

      thread.setName("WorkerThread");
      String name = thread.getName();
      System.out.println("线程名称: " + name);
      

              线程名称不影响线程的执行逻辑,但它对开发者了解线程的功能和状态起到重要作用,特别是在多线程调试中非常有用。

       

              (3)线程状态(State)

              线程状态表示线程当前的执行状态,Thread.State 是一个枚举类型,包含了线程的几种典型状态,如 NEW(新建)、RUNNABLE(可运行)、BLOCKED(阻塞)、WAITING(等待)、TIMED_WAITING(计时等待)和 TERMINATED(终止)。开发者可以通过 getState() 方法获取线程的当前状态:

      Thread.State state = thread.getState();
      System.out.println("线程状态: " + state);
      

              线程状态的变化能够帮助开发者理解线程的生命周期和调度行为,尤其是在遇到阻塞或死锁问题时,状态信息能够提供有力的调试依据。

       

              (4)线程优先级(Priority)

              每个线程都有一个优先级,范围从 1 到 10。线程优先级是操作系统用来调度线程的一个参考值,优先级高的线程更有可能获得 CPU 时间片。开发者可以通过 setPriority() 和 getPriority() 方法来设置和获取线程的优先级:

      thread.setPriority(Thread.MAX_PRIORITY);
      int priority = thread.getPriority();
      System.out.println("线程优先级: " + priority);
      

              尽管优先级会影响线程的调度顺序,但并不能保证线程优先级较高的线程一定会首先执行,因为线程调度最终由操作系统控制。

       

              (5)后台线程(Daemon)

              后台线程,也称为守护线程,是一种特殊的线程类型。当所有非后台线程结束时,JVM 会自动退出,即使后台线程仍然在运行。典型的后台线程包括垃圾回收线程,它们在系统后台执行一些不需要用户直接干预的操作。可以通过 setDaemon(true) 来将一个线程设置为后台线程:

      thread.setDaemon(true);
      boolean isDaemon = thread.isDaemon();
      System.out.println("是否为后台线程: " + isDaemon);
      

              后台线程非常适合用于执行长期运行且不依赖于用户输入的任务,例如监控、清理任务等。但需要注意的是,JVM 退出时后台线程会被强制停止,可能导致任务未能完全执行完毕。

       

              (6)线程存活状态(Alive)

              一个线程在调用 start() 方法之后即被视为“存活”,直到它的 run() 方法执行完毕或者被强制中断后才会结束。开发者可以通过 isAlive() 方法检查线程是否仍在运行:

      boolean isAlive = thread.isAlive();
      System.out.println("线程是否存活: " + isAlive);
      

              线程的存活状态能够帮助开发者判断一个线程是否已经结束执行,这在需要等待线程完成任务时非常有用。

       

              (7)线程中断标志(Interrupted)

              当一个线程被其他线程调用 interrupt() 方法时,它会被标记为中断状态。线程可以通过 isInterrupted() 或 interrupted() 方法来检查自身是否被中断:

      thread.interrupt();  // 中断线程
      boolean isInterrupted = thread.isInterrupted();
      System.out.println("线程是否被中断: " + isInterrupted);
      

              中断通常用于停止线程的执行,特别是在需要安全终止线程时,开发者可以通过捕获 InterruptedException 来终止阻塞中的线程操作(例如 sleep())。

              以上就是Java中线程的一些基本属性了!!!

       

              【2】Thread类的常用方法

              (1)启动一个线程 - start()

              在 Java 中,创建了一个 Thread 对象并不意味着线程会立即执行。线程的创建仅仅是分配了一些系统资源,但要让线程真正开始执行,还需要调用 start() 方法。当 start() 方法被调用时,线程进入到 可运行状态(RUNNABLE),然后等待被系统的线程调度器选中并执行其 run() 方法。

              注意: 直接调用 run() 方法不会启动新线程,它只是将 run() 方法当作普通的方法来执行,运行在当前调用线程中。真正启动线程的方式是调用 start() 方法,它会在 JVM 中真正创建一个新线程。

      以下为一个代码案例:

      class MyThread extends Thread {
          @Override
          public void run() {
              System.out.println(Thread.currentThread().getName() + " 线程正在执行");
          }
      }
      
      public class ThreadStartExample {
          public static void main(String[] args) {
              MyThread thread = new MyThread();  // 创建线程
              System.out.println("线程状态:" + thread.getState());  // NEW
              thread.start();  // 启动线程
              System.out.println("线程状态:" + thread.getState());  // RUNNABLE
          }
      }
      

      在上面的代码中,线程在 start() 调用后,从 新建状态(NEW)切换为 可运行状态(RUNNABLE),此时线程可以被操作系统调度并执行。

       

              (2)中断一个线程 - interrupt()      

              在多线程编程中,有时需要安全地停止一个正在执行的线程。Java 提供了 interrupt() 方法,用于通知线程停止执行。需要注意的是,interrupt() 并不会强制终止线程,而是通过设置线程的中断状态来通知线程自己是否应该终止。

              线程可以通过检查其中断状态来决定是否结束运行。如果线程正在执行阻塞操作(如 sleep() 或 wait()),那么 interrupt() 会导致这些操作抛出 InterruptedException,从而跳出阻塞状态并执行相应的终止逻辑。

      以下为一个代码案例:

      public class ThreadInterruptExample {
          public static void main(String[] args) throws InterruptedException {
              Thread thread = new Thread(() -> {
                  try {
                      for (int i = 0; i < 5; i++) {
                          System.out.println(Thread.currentThread().getName() + " 正在执行");
                          Thread.sleep(1000);  // 模拟工作
                      }
                  } catch (InterruptedException e) {
                      System.out.println(Thread.currentThread().getName() + " 被中断");
                  }
              });
      
              thread.start();
              Thread.sleep(3000);  // 主线程等待3秒
              thread.interrupt();  // 中断线程
          }
      }
      

      thread.interrupt() 会中断线程,使得 sleep() 操作抛出 InterruptedException,从而线程终止。

       

              (3)等待一个线程 - join()

              有时候,在主线程或其他线程中,我们希望等待某个线程执行完毕再继续执行后续操作。此时,可以使用 join() 方法。join() 会让调用线程进入 等待状态,直到目标线程执行完毕或达到指定的等待时间(如果提供了超时参数)。通过 join() 方法,我们可以确保一个线程在另一个线程执行完成之后才继续执行。

      以下为一个代码案例: 

      public class ThreadJoinExample {
          public static void main(String[] args) throws InterruptedException {
              Thread thread1 = new Thread(() -> {
                  for (int i = 0; i < 3; i++) {
                      System.out.println(Thread.currentThread().getName() + " 正在工作");
                      try {
                          Thread.sleep(1000);  // 模拟工作
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                  }
                  System.out.println(Thread.currentThread().getName() + " 工作完成");
              });
      
              Thread thread2 = new Thread(() -> {
                  System.out.println(Thread.currentThread().getName() + " 准备开始工作");
              });
      
              thread1.start();
              thread1.join();  // 主线程等待 thread1 完成
              thread2.start();  // 只有 thread1 完成后,thread2 才会启动
          }
      }
      

      在这个例子中,主线程会调用 thread1.join() 来等待 thread1 完成,只有当 thread1 执行完毕后,thread2 才会开始执行。

       

              (4)获取当前线程引用 - Thread.currentThread()

              在多线程编程中,有时我们需要获取当前正在执行的线程对象。Java 提供了静态方法 Thread.currentThread(),它返回对当前线程的引用。通过这个方法,开发者可以获取当前线程的名称、ID、优先级等属性,或对当前线程进行操作(例如检查中断状态)。

      public class CurrentThreadExample {
          public static void main(String[] args) {
              Thread thread = new Thread(() -> {
                  // 获取当前线程引用
                  Thread currentThread = Thread.currentThread();
                  System.out.println("当前线程名称: " + currentThread.getName());
              });
      
              thread.start();
              
              // 获取主线程的引用
              Thread mainThread = Thread.currentThread();
              System.out.println("主线程名称: " + mainThread.getName());
          }
      }
      

      在这个示例中,我们使用了 Thread.currentThread() 获取当前线程的引用,并打印了线程的名称。无论是在新启动的线程中还是主线程中,这个方法都可以用于获取当前执行线程的相关信息。

       

              (5)休眠当前线程 - Thread.sleep()

              在多线程编程中,常常需要让线程在某些时刻暂停执行一段时间。Java 提供了 Thread.sleep() 方法,可以让线程进入 休眠状态。线程在休眠期间不会占用 CPU 资源,但它仍然保持着某些锁定状态。当休眠时间结束后,线程会恢复到 就绪状态,等待 CPU 的调度。

              需要注意的是,sleep() 可能会抛出 InterruptedException,因此在调用时通常需要处理该异常。

      public class ThreadSleepExample {
          public static void main(String[] args) {
              Thread thread = new Thread(() -> {
                  try {
                      System.out.println(Thread.currentThread().getName() + " 开始休眠");
                      Thread.sleep(3000);  // 线程休眠3秒
                      System.out.println(Thread.currentThread().getName() + " 休眠结束");
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              });
      
              thread.start();
          }
      }
      

      在这个例子中,线程通过 Thread.sleep() 休眠了 3 秒钟,然后继续执行剩下的代码。sleep() 的休眠时间是最低限制,也就是说,线程休眠的时间可能会比指定的时间稍长,因为休眠结束后线程需要等待系统的调度。

              以上是关于如何启动、等待、获取当前线程、休眠和中断线程的详细解释,这些操作都是 Java 多线程编程中常用的基本方法,希望读者可以根据上述的案例以及讲解对Java中的Thread的类有自己独到的理解!

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/2302_80198073/article/details/143136218,作者:秋刀鱼不做梦,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:指针三探启幽航,类型开篇韵绕梁

      下一篇:Java中的经典排序算法:快速排序、归并排序和计数排序详解(如果想知道Java中有关快速排序、归并排序和计数排序的知识点,那么只看这一篇就足够了!)

      相关文章

      2025-05-19 09:04:38

      mysql只有在任务处于完成状态才能运行

      mysql只有在任务处于完成状态才能运行

      2025-05-19 09:04:38
      MySQL , 任务 , 数据库 , 查询 , 状态
      2025-05-16 09:15:17

      Linux系统基础-多线程超详细讲解(5)_单例模式与线程池

      Linux系统基础-多线程超详细讲解(5)_单例模式与线程池

      2025-05-16 09:15:17
      单例 , 线程 , 队列
      2025-05-16 09:15:10

      【强化学习】强化学习的基本概念与应用

      强化学习(Reinforcement Learning, RL)是一种机器学习方法,通过与环境的交互来学习如何采取行动,以最大化累积奖励。强化学习在机器人控制、游戏AI、自动驾驶等领域取得了显著成就。

      2025-05-16 09:15:10
      代理 , 学习 , 状态
      2025-05-14 10:07:38

      超级好用的C++实用库之互斥锁

      互斥锁是一种用于多线程编程的同步机制,其主要目的是确保在并发执行环境中,同一时间内只有一个线程能够访问和修改共享资源。

      2025-05-14 10:07:38
      CHP , Lock , 互斥 , 线程 , 释放 , 锁定
      2025-05-14 10:03:13

      arm架构下JAVA开发

      ARM(Advanced RISC Machine)是一种基于精简指令集计算(RISC)设计的处理器架构。它以高效、节能著称,因此广泛应用 于从智能手机到物联网设备的各个领域。

      2025-05-14 10:03:13
      Java , JVM , 嵌入式 , 架构 , 设备
      2025-05-14 10:03:13

      超级好用的C++实用库之线程基类

      在C++中,线程是操作系统能够进行运算调度的最小单位。一个进程可以包含多个线程,这些线程共享进程的资源,比如:内存空间和系统资源,但它们有自己的指令指针、堆栈和局部变量等。

      2025-05-14 10:03:13
      Linux , void , Windows , 函数 , 操作系统 , 线程
      2025-05-14 10:02:58

      Java实现根据概率中奖率怎么算

      要实现根据概率计算中奖率的功能,可以使用 Java 编程语言编写一个简单的程序。

      2025-05-14 10:02:58
      Java , 概率 , 模拟 , 程序
      2025-05-14 10:02:58

      java休眠到指定时间怎么写

      java休眠到指定时间怎么写

      2025-05-14 10:02:58
      java , sleep , Thread , util , 方法
      2025-05-14 10:02:48

      互斥锁解决redis缓存击穿

      在高并发系统中,Redis 缓存是一种常见的性能优化方式。然而,缓存击穿问题也伴随着高并发访问而来。

      2025-05-14 10:02:48
      Redis , 互斥 , 数据库 , 线程 , 缓存 , 请求
      2025-05-14 09:51:21

      Java 代码本地设置Hadoop用户名密码

      在Hadoop环境中,通常使用Kerberos进行身份验证。但在一些开发或测试环境中,我们可能需要在本地代码中设置用户名和密码来模拟或进行简单的测试。

      2025-05-14 09:51:21
      Hadoop , Java , 代码 , 使用 , 用户名 , 认证
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5253843

      查看更多

      最新文章

      Linux系统基础-多线程超详细讲解(5)_单例模式与线程池

      2025-05-16 09:15:17

      超级好用的C++实用库之互斥锁

      2025-05-14 10:07:38

      arm架构下JAVA开发

      2025-05-14 10:03:13

      超级好用的C++实用库之线程基类

      2025-05-14 10:03:13

      Java实现根据概率中奖率怎么算

      2025-05-14 10:02:58

      互斥锁解决redis缓存击穿

      2025-05-14 10:02:48

      查看更多

      热门文章

      Java线程同步synchronized wait notifyAll

      2023-04-18 14:15:05

      Java/Android Annotation注解/注入(二)

      2023-04-13 09:37:00

      Android/Java判断字符串String是否为float浮点数或double类型

      2023-04-17 09:39:54

      Java小数点数字和百分号数字之间的转换

      2023-04-13 09:48:57

      Java的自带注解Annotation(一)

      2023-05-10 06:02:06

      Java/Android Annotation注解/注入(三)

      2023-04-13 09:37:00

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      Java学习之方法调用过程图解(理解)

      《Java编程思想》读书笔记之第3章-操作符

      使用Java和JPA构建健壮的数据库应用

      Java中的枚举类型详解

      Java中的内存数据库与缓存技术

      Java中的异常处理

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号