news 2026/4/18 13:24:26

线程的常用方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
线程的常用方法

目录

1. 获取当前线程 - Thread.currentThread()

2. 线程命名 - setName() 和 getName()

3. 线程休眠 - Thread.sleep()

4. 线程插队 - join()

5. 启动线程 - start()

6. 中断线程 - interrupt()

7. 线程优先级 - setPriority() 和 getPriority()

8. 守护线程 - setDaemon()

9. 线程状态检查


1. 获取当前线程 - Thread.currentThread()

作用:

静态方法,返回当前正在执行的线程对象

可以在任何地方调用,获取当前执行环境的线程

2. 线程命名 - setName() 和 getName()

默认命名规则:

主线程:"main"

子线程:"Thread-0", "Thread-1", ...

示例代码:

package ThreadAPI; public class Demo1 { public static void main(String[] args) { // 哪个线程调用的这个代码,这个代码就拿到哪个线程的名字 // 主线程名字叫做main Thread m = Thread.currentThread(); // 🔑 获取当前线程对象 m.setName("主线程"); // 🔑 设置线程名称 // 创建并启动第一个线程 Thread t1 = new MyThread(); t1.setName("1号线程"); // 🔑 设置线程名称 t1.start(); // 🔑 启动线程 // 创建并启动第二个线程 Thread t2 = new MyThread(); t2.setName("2号线程"); t2.start(); // 主线程执行的任务 for (int i = 0; i < 6; i++) { System.out.println("Main方法输出:" + i); } // 输出线程名称 System.out.println(m.getName()); // 🔑 获取线程名称 System.out.println(t1.getName()); System.out.println(t2.getName()); } } class MyThread extends Thread { public void run() { // 🔑 在子线程中获取当前线程对象及其名称 for (int i = 0; i < 6; i++) { System.out.println(MyThread.currentThread().getName() + "输出:" + i); } } }


3. 线程休眠 - Thread.sleep()

特性:

静态方法:让当前线程休眠指定时间

不会释放锁:如果持有锁,休眠期间仍然持有

单位:毫秒(1秒 = 1000毫秒)

必须捕获异常:InterruptedException

精确性:不保证精确时间,受系统调度影响

应用场景:

定时任务

模拟网络延迟

控制执行节奏

避免CPU空转

代码:

package ThreadAPI; /** * sleep方法(线程休眠) */ public class Demo2 { public static void main(String[] args) { for (int i = 1; i <= 10; i++) { System.out.println(i); try { // 🔑 让当前线程休眠1000毫秒(1秒) Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }

4. 线程插队 - join()

代码:

package ThreadAPI; /** * join方法 */ public class Demo3 { // 搞清楚线程的join方法:让调用这个方法的线程先执行完(线程插队) public static void main(String[] args) { MyThread2 m1 = new MyThread2(); m1.start(); for (int i = 1; i < 5; i++) { System.out.println("主线程输出:" + i); if (i == 1) { try { // 🔑 让m1线程先执行完,再执行主线程 m1.join(); } catch (Exception e) { e.printStackTrace(); } } } } } class MyThread2 extends Thread { public void run() { for (int i = 1; i < 5; i++) { System.out.println(ThreadAPI.MyThread.currentThread().getName() + "输出:" + i); } } }

三种重载形式:

void join() // 无限期等待,直到线程结束 void join(long millis) // 最多等待指定毫秒数 void join(long millis, int nanos) // 更精确的时间控制


执行效果:

原始执行顺序: 主线程:输出1 → 输出2 → 输出3 → 输出4 子线程:输出1 → 输出2 → 输出3 → 输出4 使用join()后 主线程:输出1 → [等待子线程] → 输出2 → 输出3 → 输出4 子线程:输出1 → 输出2 → 输出3 → 输出4(优先执行完毕)


应用场景:

等待子线程完成后再继续主线程

多个线程协同工作,需要顺序执行

汇总多个线程的结果


5. 启动线程 - start()

Thread t1 = new MyThread(); t1.start(); // 正确:启动新线程,由JVM调用run() // 错误示例: t1.run(); // 错误:只是普通方法调用,不会创建新线程


特点:

只能调用一次,多次调用会抛 IllegalThreadStateException

真正创建新线程执行

6. 中断线程 - interrupt()

Thread t = new Thread(() -> { while (!Thread.currentThread().isInterrupted()) { // 正常执行任务 } System.out.println("线程被中断"); }); t.start(); // 一段时间后中断线程 Thread.sleep(1000); t.interrupt();


相关方法:

interrupt():设置中断标志

isInterrupted():检查中断标志

interrupted():检查并清除中断标志(静态方法)

7. 线程优先级 - setPriority() 和 getPriority()

Thread t1 = new Thread(); t1.setPriority(Thread.MAX_PRIORITY); // 10 t1.setPriority(Thread.NORM_PRIORITY); // 5(默认) t1.setPriority(Thread.MIN_PRIORITY); // 1 System.out.println(t1.getPriority()); // 获取优先级 注意:优先级只是建议,实际调度由操作系统决定

8. 守护线程 - setDaemon()

Thread daemonThread = new Thread(() -> { while (true) { System.out.println("守护线程运行中..."); Thread.sleep(1000); } }); daemonThread.setDaemon(true); // 设置为守护线程 daemonThread.start();

主线程结束后,守护线程会自动结束
特点:

为其他线程提供服务

当所有用户线程结束时,守护线程自动结束

不能手动设置为守护线程后再启动(setDaemon() 必须在 start() 前调用)

9. 线程状态检查

Thread t = new Thread(); System.out.println(t.getState()); // NEW(新建状态) t.start(); System.out.println(t.getState()); // RUNNABLE(可运行状态) Thread.sleep(100); System.out.println(t.getState()); // TIMED_WAITING(定时等待状态)


线程状态:

NEW:新建,未启动

RUNNABLE:可运行或正在运行

BLOCKED:阻塞(等待锁)

WAITING:无限期等待

TIMED_WAITING:定时等待

TERMINATED:终止

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 5:32:52

蓝桥杯 嵌入式 客观题 [1000道]第二期 持续更新中

1. 在蓝桥杯嵌入式竞赛常用的CT117E-M4开发板上&#xff0c;为了控制LED灯&#xff08;LD1~LD8&#xff09;&#xff0c;使用了74HC573锁存器配合74LS138译码器进行片选。若要选通控制LED的锁存器&#xff08;通常连接在Y4&#xff09;&#xff0c;则74LS138的输入端 A2, A1, A…

作者头像 李华
网站建设 2026/4/18 8:39:12

【MongoDB实战】7.3 批量操作优化:BulkWrite

文章目录 7.3 批量操作优化:BulkWrite 前置准备 1. 环境要求 2. 基础连接代码 7.3.1 循环单条操作vs批量操作:性能差异对比 核心差异 实战性能对比(测试10000条插入) 典型输出结果(参考) 差异原因分析 7.3.2 BulkWrite实战:批量插入、更新、删除组合操作 核心语法 实战:…

作者头像 李华
网站建设 2026/4/18 3:36:34

【2026年精选毕业设计:基于SpringBoot框架的停车场管理系统设计与实现(含论文+源码+PPT+开题报告+任务书+答辩讲解)】

2026年精选毕业设计&#xff1a;基于SpringBoot框架的停车场管理系统设计与实现&#xff08;含论文源码PPT开题报告任务书答辩讲解&#xff09; &#x1f525; 全套资料开源免费&#xff01;文末一键领取 GitHub 源码 完整毕设大礼包&#xff01; 还在做“学生信息管理系统”&…

作者头像 李华
网站建设 2026/4/18 0:58:08

Jspreadsheet Pro 12.0

使用高容量渲染扩展电子表格2025年12月12日Jspreadsheet Pro v12 通过扩展视口渲染优化性能&#xff0c;确保大型电子表格具有响应性和可扩展性。Jspreadsheet Pro 是一款灵活的基于 JavaScript 的电子表格解决方案&#xff0c;使开发人员能够为 Web 应用程序创建可定制且功能丰…

作者头像 李华
网站建设 2026/4/17 14:20:09

Tacview 1.9.5 现已发布!通用飞行数据分析工具

通用飞行数据分析工具 最新消息 Tacview 1.9.5 现已发布&#xff01; Tacview是什么&#xff1f; 想了解上次飞行中究竟发生了什么吗&#xff1f;Tacview 是一款通用的飞行分析工具&#xff0c;可让您轻松分析和了解任何飞行&#xff0c;从而比传统的飞行后总结方式更快地提高…

作者头像 李华
网站建设 2026/4/17 20:28:37

Vue3如何利用组件实现大文件分块上传的批量处理?

【一个被4G大文件逼疯的北京码农自述&#xff1a;如何在信创环境下优雅地让政府文件"飞"起来】 各位战友好&#xff0c;我是老张&#xff0c;北京某软件公司前端组"秃头突击队"队长。最近接了个政府项目&#xff0c;客户要求用国产环境上传4G大文件&#x…

作者头像 李华