Java中终止线程的3种方法,你是否了解?

这篇具有很好参考价值的文章主要介绍了Java中终止线程的3种方法,你是否了解?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、stop 方法终止线程(线程不安全,不推荐)

直接使用thread.stop()来强行终止线程,线程会立即终止执行,可能会产生不可预料的结果。在调用thread.stop()后会导致该线程所持有的所有锁突然释放(不可控制),那么被保护数据就有可能呈现不一致性,其他线程在使用这些被破坏的数据时,有可能导致一些很奇怪的应用程序错误。因此,并不推荐使用 stop 方法来终止线程。

二、使用退出标志退出线程

public volatile boolean exit=false;
public void run() {
    while (!exit){
      //do something
    }
}

通过使用volatile修饰的boolean类型的共享变量,在设置exit等于true时,该运行中的线程会退出while循环,执行完run方法结束

volatile保证了可见性和防止指令重排

三、Interrupt方法结束线程

使用interrupt()方法来中断线程有两种情况:

  • 线程处于阻塞状态:如使用了sleep,wait,await,socket中的receiver,accept等方法时,会使线程处于阻塞状态。当调用线程的interrupt()方法时,会抛出InterruptException异常,通过代码捕获该异常,然后break跳出循环状态,结束这个线程的执行。通常很多人认为只要调用interrupt方法线程就会结束,实际上是错的,一定要先捕获InterruptedException异常之后通过break来跳出循环,才能正常结束run方法。

public void run () {
    //非阻塞过程中通过判断中断标志来退出
    while (!Thread.interrupted()) {
        try {
            Thread.sleep(3 * 1000);
        } catch (InterruptedException e) {
            //捕获到异常之后,执行 break 跳出循环break;
        }
    }
}
  • 线程处于非阻塞状态:使用isInterrupted()判断线程的中断标志来退出循环。当使用interrupt()方法时,中断标志就会置true,和使用自定义的标志来控制循环是一样的道理。文章来源地址https://www.toymoban.com/news/detail-581761.html

Thread.currentThread().isInterrupted()和Thread.interrupted()的区别?
两者都是判断当前线程是否中断,isInterrupted()不会清除中断标志,interrupted()会清除掉中断标志。

到了这里,关于Java中终止线程的3种方法,你是否了解?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学Java线程,你不知道什么是AQS?一文带你了解Java多线程同步的灵魂

    关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 我们继续总结学习 Java基础知识 ,温故知新。 CLH(Craig, Landin, and Hagersten locks)是一种自旋锁,能确保无饥饿性,提

    2024年02月16日
    浏览(47)
  • 主线程等待所有子线程结束的4种方法

    主线程等待所有子线程结束的4种方法,包括使用 CountDownLatch 、 CyclicBarrier 、 Future.get() 、 Completable.allOf() 。 结果如下: 结果如下: 2.1、CyclicBarrier使用 结果如下: 由代码和执行结果可以看出: 屏障拦截数要算上主线程即:屏障拦截数量=子线程数量+主线程数量(11=10+1) 主

    2024年02月14日
    浏览(30)
  • 解决Tomcat异常:java.lang.IllegalStateException: 非法访问:此Web应用程序实例已停止。无法加载。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。

    调试项目的时候发现每次使用idea重新部署项目时会出现这个错误,但是不影响实际使用,重启服务器第一次部署时也不会出现错误,尝试搜索解决这个问题。 解决方法: 进入tomcat目录下查找配置文件,conf Context.xml,查找Context标签,修改属性reloadble为 reloadable=“false” (如果

    2024年02月04日
    浏览(57)
  • 【从零开始学习JAVA | 第四十篇】了解线程池

    目录 前言: 线程池: 线程池的工作流程: 代码实现线程池: 任务拒绝策略:  线程池多大才算合适? 总结:         在Java编程中,线程池是一个强大的工具,它能够管理和复用线程,提供高效的并发处理能力。通过线程池,我们可以有效地控制并发线程的数量,并降

    2024年02月13日
    浏览(56)
  • 【工作流Activiti7】4、Activiti7 结束/终止流程

    1.  结束/终止 正在运行的流程实例 思路:跟回退一样的思路一样,直接从当前节点跳到结束节点(EndEvent)  补充1:关于BUSINESS_KEY_ BUSINESS_KEY_ 字段是用于将业务系统与Actititi工作流关联的段,通常我们用它来存放业务表的ID,比如:请假ID、报销ID等等。 但是,通常咱

    2024年02月09日
    浏览(52)
  • java用正则方法验证文件名是否合法

    Java中用到文件操作时,经常要验证文件名是否合法. 用File类的createNewFile()方法的确很管用.但当要批量验证时,效率上就会有问题.正则匹配的开销比创建文件少了很多. 那么一个合法的文件(Win下)应该符合如下规则:  1.文件名不能为空,空在这里有两个意思:  文件名(包括扩展名

    2024年02月10日
    浏览(36)
  • Java中判断对象是否为空的方法详解

    在Java编程中,经常会遇到判断对象是否为空的情况。空指针异常是常见的程序错误之一,因此在编码过程中,判断对象是否为空是一个重要的防御措施。本篇博客将深入探讨Java中判断对象是否为空的不同方法,包括使用条件判断、使用Java 8的Optional类、使用Apache Commons Lang库

    2024年02月13日
    浏览(77)
  • 微软Surface Book 2终止更新日前推迟,将与Surface Pro 6同日结束服务

    近日有消息称,微软公布了旗下Surface系列设备的更新支持终止日期,并且包括新发布的设备和前代产品。 早在本月23日,微软就为Surface Book 2推送了新的固件,主要提升了Surface Dock 2的稳定性,及其他一些安全更新。 而此次微软延长了Surface Book 2的更新支持终止日期,到今年

    2024年02月12日
    浏览(48)
  • Java检查值是否存在于数组中的3种方法

    在 Java 中,有许多方法可以检查此数组中是否存在特定元素。 时间复杂度:O(N) 辅助空间:O(1) for (int element : arr) {     if (element == toCheckValue) {         return true;     } } 示例代码: 运行结果: Array: [5, 1, 1, 9, 7, 2, 6, 10] Is 7 present in the array: true Java 中的 List contains() 方法用

    2024年02月08日
    浏览(46)
  • 【Java SE】判断两个文件内容是否相同的多种方法

    逐字节比较文件内容。这种方法适用于小文件,但对于大文件会比较耗时。 计算文件的哈希值(如 MD5、SHA-256 等),然后比较两个文件的哈希值。如果哈希值相同,则可以认为文件内容相同。这种方法适用于大文件,因为只需要比较哈希值而不是整个文件内容。 通过使用

    2024年02月07日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包