news 2026/4/29 16:31:03

Java中止线程的三种方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java中止线程的三种方式

Java中止线程的三种方式

章节目录

文章目录

  • Java中止线程的三种方式
  • 1.使用标志位中止线程(推荐)
  • 2.使用stop()中止线程(不推荐)
  • 3.使用interrupt()中断线程
  • 停止一个线程通常意味着在线程处理任务完成之前停到正在做的操作,也就是放弃当前的操作;
  • 在Java中有以下3中方式可以中止正在运行的线程;
  • 使用退出标志,使线程正常退出,也就是当run()方法完成后线程终止;
  • 使用stop()方法强行终止线程,但是不推荐使用这个方法,该方法已被弃用;
  • 使用interrupt方法中断线程。

1.使用标志位中止线程(推荐)

  • 在run()方法执行完毕后,该线程就中止了;
  • 但是在某些特殊情况下,run()方法会被一只执行;
  • 比如在服务端程序中可能会使用while(true){…}这样的循环结构来不断的接收来自客户端的请求;
  • 此时就可以用修改标志位的方式来结束run()方法。
publicclassExitFlagTests{// volatile修饰符用来保证其它线程读取的总是该变量的最新的值privatevolatilebooleanexitFlag=false;// 退出标志publicvoidrun(){while(!exitFlag){// 执行线程的任务System.out.println("Thread is running...");try{Thread.sleep(1000);// 模拟一些工作}catch(InterruptedExceptione){// 处理中断(如果需要)Thread.currentThread().interrupt();// 重新设置中断状态}}System.out.println("Thread is stopping...");}publicvoidstop(){exitFlag=true;// 设置退出标志为true}publicstaticvoidmain(String[]args)throwsInterruptedException{ExitFlagTestsexit=newExitFlagTests();Threadthread=newThread(exit::run);thread.start();// 让线程运行一段时间Thread.sleep(5000);// 请求线程停止exit.stop();}}

2.使用stop()中止线程(不推荐)

  • Thread.stop()方法可以强行中止线程的执行;
  • 然而,这种方法是不安全的,因为它不能保证线程资源的正确释放和清理;
  • 这可能导致数据不一致和资源泄漏等问题,因此被官方弃用。
publicclassStopMethodTestsextendsThread{publicvoidrun(){while(true){System.out.println("Thread is running...");try{Thread.sleep(1000);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}}}publicstaticvoidmain(String[]args)throwsInterruptedException{StopMethodTeststhread=newStopMethodTests();thread.start();// 让线程运行一段时间Thread.sleep(5000);// 强行中止线程(不推荐)thread.stop();}}

为什么启用stop:

  1. 调用stop()方法会立刻停止run()方法中剩余的全部工作,包括在catch或finally语句中的,并抛出ThreadDeath异常(通常情况下次异常不需要显示的捕获);
  2. 因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭;
  3. 调用stop()方法会立即释放该线程所持有的所有的锁,导致数据得不到同步,出现数据不一致的问题。

3.使用interrupt()中断线程

  • 我们现在知道了stop()方法停止线程是非常不安全的方式,那么我们应该使用什么方法来停止线程呢?
  • 使用interrupt()方法来中断线程;
  • 调用interrupt()方法仅仅是在当前线程中打一个停止标记,并不是真的停止线程;
  • 也就是线程中断并不会立即中止线程,而是通知目标线程,有人希望你终止;
  • 目标线程收到通知后会如何处理,由目标线程决定;
  • 如果一个线程不能被interrupt,那么stop方法也不会起作用。
publicclassInterruptTestsextendsThread{publicstaticvoidmain(String[]args){try{InterruptTestst=newInterruptTests();// 启动线程t.start();Thread.sleep(200);// 中断线程 tt.interrupt();}catch(InterruptedExceptione){e.printStackTrace();}}@Overridepublicvoidrun(){super.run();// 循环打印 i 的值,从 0 到 200000for(inti=0;i<=200000;i++){System.out.println("i="+i);}}}

通过运行以上代码,我们会发现interrupt方法并没有停止线程t中的处理逻辑,也就是说t线程被设置中断状态,但这个中断不会起作用,那么如何停止线程呢?

publicbooleanThread.isInterrupted()//判断是否被中断publicstaticbooleanThread.interrupted()//判断是否被中断,并清除当前中断状态
  • 这两个方法使得当前线程能够感知到是否被中断了(通过检查标志位)。

  • 所以如果希望线程 t 在中断后停止,就必须先判断是否被中断,并为它增加相应的中断处理代码:

@Overridepublicvoidrun(){super.run();for(inti=0;i<=200000;i++){//判断是否被中断if(Thread.currentThread().isInterrupted()){//处理中断逻辑break;}System.out.println("i="+i);}}
  • 在上面这段代码中,我们增加了 Thread.isInterrupted() 来判断当前线程是否被中断了,如果是,则退出 for 循环,结束线程。

  • 这种方式看起来与之前介绍的“使用标志位中止线程”非常类似,但是在遇到 sleep() 或者 wait() 这样的操作,我们只能通过中断来处理了

publicstaticnativevoidsleep(longmillis)throwsInterruptedException
  • Thread.sleep() 方法会抛出一个 InterruptedException 异常,当线程被 sleep() 休眠时,如果被中断,这会就抛出这个异常。

[!NOTE]

(注意:Thread.sleep() 方法由于中断而抛出的异常,是会清除中断标记的。)

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

自主智能体落地难题全攻克(Open-AutoGLM工程化实践精华)

第一章&#xff1a;自主智能体Open-AutoGLM架构概览Open-AutoGLM 是一个面向任务驱动的开源自主智能体框架&#xff0c;旨在通过大语言模型&#xff08;LLM&#xff09;实现复杂场景下的自动化决策与执行。该架构融合了自然语言理解、工具调用、记忆机制与自我反思能力&#xf…

作者头像 李华
网站建设 2026/4/26 0:42:50

Windows字体个性化终极方案:No!! MeiryoUI完全指南

Windows字体个性化终极方案&#xff1a;No!! MeiryoUI完全指南 【免费下载链接】noMeiryoUI No!! MeiryoUI is Windows system font setting tool on Windows 8.1/10/11. 项目地址: https://gitcode.com/gh_mirrors/no/noMeiryoUI 还在为Windows系统千篇一律的字体显示效…

作者头像 李华
网站建设 2026/4/22 9:04:30

海尔智能家居集成教程:打通全屋设备控制壁垒

海尔智能家居集成教程&#xff1a;打通全屋设备控制壁垒 【免费下载链接】haier 项目地址: https://gitcode.com/gh_mirrors/ha/haier 还在为家中不同品牌的智能设备无法统一管理而烦恼吗&#xff1f;海尔智能家居集成插件正是你需要的解决方案&#xff01;这款专为Hom…

作者头像 李华
网站建设 2026/4/29 6:33:39

PaddlePaddle镜像发布轻量化版本,适合低配GPU运行

PaddlePaddle轻量化镜像&#xff1a;低配GPU上的高效AI部署新选择 在中小企业和边缘设备普遍面临算力瓶颈的今天&#xff0c;如何让深度学习模型真正“跑得动、用得起”&#xff0c;成为AI落地的关键挑战。尤其是在中文OCR、文本分类等本土化任务中&#xff0c;许多团队受限于G…

作者头像 李华
网站建设 2026/4/25 2:04:28

AMD显卡实时监控神器:amdgpu_top完整使用指南

AMD显卡实时监控神器&#xff1a;amdgpu_top完整使用指南 【免费下载链接】amdgpu_top Tool to display AMDGPU usage 项目地址: https://gitcode.com/gh_mirrors/am/amdgpu_top 想要实时掌握AMD显卡运行状态&#xff1f;amdgpu_top是一款专为Linux系统设计的轻量级AMD显…

作者头像 李华