news 2026/4/18 11:23:26

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/17 8:34:06

为什么90%的开发者都卡在Open-AutoGLM入口?真相揭晓

第一章&#xff1a;为什么90%的开发者都卡在Open-AutoGLM入口&#xff1f;对于许多初次接触 Open-AutoGLM 的开发者而言&#xff0c;看似简单的接入流程背后却隐藏着大量未被文档明确说明的“暗坑”。这些陷阱并非源于技术复杂性&#xff0c;而是由于环境依赖模糊、权限配置缺失…

作者头像 李华
网站建设 2026/4/11 12:00:02

ImageJ科学图像处理终极指南:从入门到精通完整教程

ImageJ科学图像处理终极指南&#xff1a;从入门到精通完整教程 【免费下载链接】ImageJ Public domain software for processing and analyzing scientific images 项目地址: https://gitcode.com/gh_mirrors/im/ImageJ 想要轻松驾驭复杂的科学图像分析吗&#xff1f;&a…

作者头像 李华
网站建设 2026/4/18 9:44:31

基于Python的车间设备保养管理系统的设计与实现(开题报告)

毕业设计题目 基于Python的车间设备保养管理系统的设计与实现 一、选题的依据和意义 (一)选题依据 近年来,国家将智能制造与工业互联网上升为战略重点,工业和信息化部、国家发展和改革委员会等联合发布的《“十四五”智能制造发展规划》[1]政策明确提出“加强设备全生命周期…

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

自主智能体Open-AutoGLM核心技术解析(从零构建AI代理的底层逻辑)

第一章&#xff1a;自主智能体Open-AutoGLM底层实现概述Open-AutoGLM 是一个基于开源大语言模型构建的自主智能体框架&#xff0c;专注于实现任务自动化、环境感知与动态决策能力。其核心设计理念是将规划&#xff08;Planning&#xff09;、记忆&#xff08;Memory&#xff09…

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

Must-Reading-on-ISAC:集成感知与通信完整实践指南

Must-Reading-on-ISAC&#xff1a;集成感知与通信完整实践指南 【免费下载链接】Must-Reading-on-ISAC Must Reading Papers, Research Library, Open-Source Code on Integrated Sensing and Communications (aka. Joint Radar and Communications, Joint Sensing and Communi…

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

【Java】JPA

你希望深入了解 JPA 这个 ORM 规范&#xff0c;我会从它的定义、核心设计思想、核心组件、常用注解、基本使用方式以及与 Hibernate 的关系等方面&#xff0c;为你做全面且易懂的讲解&#xff0c;帮你彻底搞懂 JPA。 一、JPA 是什么&#xff1f; JPA&#xff08;Java Persisten…

作者头像 李华