news 2026/5/3 8:53:59

Thread类的基本用法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Thread类的基本用法

1.线程创建

见上篇博客https://blog.csdn.net/weixin_69059394/article/details/155943050?fromshare=blogdetail&sharetype=blogdetail&sharerId=155943050&sharerefer=PC&sharesource=weixin_69059394&sharefrom=from_link

2.是否是守护线程/设置守护线程

守护线程其实就是后台线程。

我们平时代码中所创建的所有线程默认都是前台线程。如需更换为后台线程,使用.setDaemon()。

判断是否是后台线程使用.isDaemon()。

JVM会在⼀个进程的所有非后台线程结束后,才会结束运行。

3.线程是否存活

java中创建的Thread对象和系统中的线程,是一一对应的关系。

但是Thread对象的生命周期和系统线程的生命周期,是不同的。很有可能Thread对象还存在,但是系统中的线程已经销毁了,判断线程是否还存活使用.isAlive()方法。

4.线程启动

.start()而非.run()。run()是线程的入口方法。

每个Thread对象只能.start()一次。(日抛)

5.进程中断

中断进程其实就是线程终止,意味着线程终止以后就不会再恢复了。

只要将线程的入口方法执行(run()方法)执行完毕,线程就随之结束了。

public class demo6 { public static boolean isFinished=false; public static void main(String[] args) throws InterruptedException { Thread t=new Thread(()->{ while(!isFinished){ System.out.println("hello thread"); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } System.out.println("t线程结束"); }); t.start(); Thread.sleep(5000); isFinished=true; } }

注意,这里我们创建的isFinished为静态成员变量,线程的入口方法是可以通过内部类访问外部类成员属性的方法,得到isFinished变量的值的。

但是当我们将isFinished写入main方法内,定义为局部变量时,程序运行失败。

以上是由于lambda表达式是回调函数,执行时机是真正创建出线程之后,因此很有可能出现线程在要创建时,main线程已经执行结束,其中的isFinished局部变量已经销毁。

所以lambda里面想要使用外部变量时,会触发变量捕获机制,将外面的局部变量拷贝一份到lambda里面,这样无论外面的局部变量是否销毁,都不影响线程的创建了。

但是变量捕获需要满足该变量为final或者实际上final,变量是不允许修改的。

java的Thread类中提供了现成的方法.interrupt()和变量isInterrupted()来中断线程和判断线程是否中断。

public class demo6 { //public static boolean isFinished=false; public static void main(String[] args) throws InterruptedException { Thread t=new Thread(()->{ while(!Thread.currentThread().isInterrupted()){ System.out.println("hello thread"); try { Thread.sleep(1000); } catch (InterruptedException e) { //throw new RuntimeException(e); break; } } System.out.println("t线程结束"); }); t.start(); Thread.sleep(6000); t.interrupt(); //isFinished=true; } }

使用.interrupt()方法不仅能设置中断标志位,还能唤醒sleep()这样的阻塞方法,唤醒sleep()以后就会抛出异常。

但是当我们不去break循环时,程序还会继续执行循环:

public class demo6 { //public static boolean isFinished=false; public static void main(String[] args) throws InterruptedException { Thread t=new Thread(()->{ while(!Thread.currentThread().isInterrupted()){ System.out.println("hello thread"); try { Thread.sleep(1000); } catch (InterruptedException e) { //throw new RuntimeException(e); //break; System.out.println("main线程尝试中断t线程"); } } System.out.println("t线程结束"); }); t.start(); Thread.sleep(6000); t.interrupt(); //isFinished=true; } }

这是由于sleep在被提前唤醒的情况下,把isInterrupted()标志位重新设置为false。这样t线程的终止权就在t线程自己手上。

6.线程等待

t.join() 表示main线程等待t线程结束。(可以理解为t线程插队到main线程前面,只有t结束,main才会执行。),

t.join(1000) 表示main线程至多等待t线程1000ms,如果不设置时间,那就等到天荒地老。

7.获取当前线程引用

public static Thread currentThread();

哪个线程调用这个静态方法就返回哪个线程的引用,作用类似于this。

8.线程休眠

需要注意的是,线程调度是不可控的,所以,实际上的休眠时间是大于参数设置的休眠时间的。

这是因为代码调用sleep,相当于线程让出了cpu资源,当设置的休眠时间到达以后,操作系统需要把线程重新调度到cpu上,才能继续执行。

时间到了,意味着允许被调度了,但不代表立刻被执行。

sleep(0)的用法,使当前进程立刻放弃cpu资源,等待操作系统重新调度。

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

AutoGPT执行心理疏导任务的伦理边界讨论

AutoGPT执行心理疏导任务的伦理边界讨论 在数字心理健康服务迅速普及的今天,一个核心矛盾日益凸显:人们对于即时、可及的心理支持需求不断增长,而专业心理咨询资源却始终稀缺且分布不均。AI聊天机器人应运而生,试图填补这一鸿沟。…

作者头像 李华
网站建设 2026/5/1 10:36:27

从GitHub获取Qwen3-14B开源代码并本地运行的全流程

从GitHub获取Qwen3-14B开源代码并本地运行的全流程 在企业对数据隐私和响应效率要求日益提高的今天,将大语言模型部署到本地环境已不再是“可选项”,而是许多行业的刚需。尤其是金融、医疗、法律等领域,敏感信息无法上传至云端,迫…

作者头像 李华
网站建设 2026/4/30 10:47:40

Qwen3-14B模型安装包获取方式及依赖环境配置

Qwen3-14B 模型部署实战:从环境配置到企业级应用 在当前AI技术加速落地的背景下,越来越多企业开始探索大语言模型的私有化部署方案。然而,面对动辄上百GB显存需求的千亿参数模型,许多中小团队望而却步。真正的挑战不在于“能不能用…

作者头像 李华
网站建设 2026/4/17 22:38:13

ATN06-0040PSM, 6dB DC-40GHz的衰减器, 现货库存

型号介绍今天我要向大家介绍的是 Marki 的一款衰减器——ATN06-0040PSM。 它拥有 50欧姆的阻抗匹配,能够保证信号的传输质量。而且,它的回波损耗低至 22dB,这意味着它几乎不会对信号造成反射,保证了信号的完整性。主要特性 工作频…

作者头像 李华
网站建设 2026/5/2 6:22:33

2025年AI大模型开发核心技术栈全解析:构建你的“开发者军火库“

本文系统解析了2025年AI大模型开发的四大核心技术栈:基础开发框架、模型训练与微调技术、推理优化与部署技术、AI编程辅助工具。技术栈呈现分层化、模块化和民主化趋势,通过整合封装这些技术,算泥社区为开发者提供一站式解决方案,…

作者头像 李华
网站建设 2026/5/1 11:26:04

AutoGPT打造自动播客生成系统:从脚本到音频

AutoGPT打造自动播客生成系统:从脚本到音频 你有没有想过,有一天只需一句话——比如“做个关于AI伦理的10分钟科普播客”——然后系统就能自己查资料、写稿子、配音、出成品?这听起来像科幻片的情节,但在今天的技术条件下&#xf…

作者头像 李华