【Java|多线程与高并发】线程的中断的两种方法

这篇具有很好参考价值的文章主要介绍了【Java|多线程与高并发】线程的中断的两种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.前言

线程中断是指在一个线程执行的过程中,强制终止该线程的执行。虽说是中断,但本质上是让run方法快点执行完,而不是run方法执行到一半,强制结束.
本文主要介绍线程中断的两种方法
【Java|多线程与高并发】线程的中断的两种方法

2. 方法1: 自定义标志位

看下面这段代码:

public class Demo6 {
    private static boolean flag = false;
    public static void main(String[] args) {
        Thread t = new Thread(()->{
            while(!flag){
                System.out.println("线程执行中!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("线程执行完了!");
        });
        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("设置标志位,让线程执行结束");
        flag = true;
    }
}

运行结果:
【Java|多线程与高并发】线程的中断的两种方法
看下面这张图:
【Java|多线程与高并发】线程的中断的两种方法
在这段代码中,定义了一个flag的标志位,在线程t中以标志位作为run方法的执行条件,每隔1s输出一次"线程执行中",再先让main线程(主线程)休眠3s,3s后main线程开始执行,输出"设置标志位,让线程执行结束",并修改flag变量的值为false,线程t不满足执行条件,因此线程t执行完毕.

3. 方法2:使用标准库自带的标志位

Java提供了一种中断线程的机制,即调用线程的interrupt()方法。
当一个线程被中断时,它会收到一个中断信号,但并不意味着线程会立即停止执行。线程可以通过检查自己的中断状态来决定是否停止执行。线程可以通过调用isInterrupted()方法来检查自己是否被中断。如果线程已经被中断,那么该方法返回true,否则返回false。

示例:

public class Demo7 {
    public static void main(String[] args) {
        Thread t = new Thread(()->{
            while(!Thread.currentThread().isInterrupted()){
                System.out.println("线程执行中!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程执行完了!");
        });
        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("设置标志位,让线程执行结束");
        t.interrupt();
    }
}

【Java|多线程与高并发】线程的中断的两种方法
但是这么写,会有问题
【Java|多线程与高并发】线程的中断的两种方法
能看到,这里抛出了一个异常.而且虽然设置标志位,但是线程并没有结束.
注意interrupt方法有两种行为:

  1. 如果线程是正常状态,会设置标志位为true
  2. 如果线程是阻塞状态(sleep),不会设置标志位,而是会触发一个InterruptedException这样的异常,这个异常会将sleep提前唤醒.由于我这里的catch中只是打印了日志,并没有结束循环,因此线程仍在执行中

如果想要结束循环,可以在catch中加上break
【Java|多线程与高并发】线程的中断的两种方法

4.总结

线程中断机制是一种优雅的线程停止方式,可以避免线程无限期地等待某个条件而导致程序出现死锁或无响应的情况。但是,线程中断并不是强制终止线程的方法,它需要线程自己来判断是否停止执行。因此,在编写线程时,需要注意在适当的时候检查线程的中断状态并做出相应的处理。
【Java|多线程与高并发】线程的中断的两种方法

感谢你的观看!希望这篇文章能帮到你!
专栏: 《从零开始的Java学习之旅》在不断更新中,欢迎订阅!
“愿与君共勉,携手共进!”
【Java|多线程与高并发】线程的中断的两种方法文章来源地址https://www.toymoban.com/news/detail-474637.html

到了这里,关于【Java|多线程与高并发】线程的中断的两种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Java|多线程与高并发】线程安全问题以及synchronized使用实例

    Java多线程环境下,多个线程同时访问共享资源时可能出现的数据竞争和不一致的情况。 线程安全一直都是一个令人头疼的问题.为了解决这个问题,Java为我们提供了很多方式. synchronized、ReentrantLock类等。 使用线程安全的数据结构,例如ConcurrentHashMap、ConcurrentLinkedQueue等

    2024年02月09日
    浏览(46)
  • 【Java|多线程与高并发】定时器(Timer)详解

    在Java中,定时器 Timer 类是用于执行定时任务的工具类。它允许你安排一个任务在未来的某个时间点执行,或者以固定的时间间隔重复执行。 在服务器开发中,客户端向服务器发送请求,然后等待服务器响应. 但服务器什么时候返回响应,并不确定. 但也不能让客户端一直等下去

    2024年02月07日
    浏览(46)
  • 【linux 多线程并发】线程本地数据存储的两种方式,每个线程可以有同名全局私有数据,以及两种方式的性能分析

    ​ 专栏内容 : 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点的情况下对故障容灾的支持。 手写数据库toadb 本专栏主要介绍如何从零开发,开发的

    2024年02月03日
    浏览(48)
  • 【Java|多线程与高并发】JUC中常用的类和接口

    JUC是Java并发编程中的一个重要模块,全称为 Java Util Concurrent (Java并发工具包),它提供了一组用于多线程编程的工具类和框架,帮助开发者更方便地编写线程安全的并发代码。 本文主要介绍 Java Util Concurrent 下的一些常用接口和类 Callable接口类似于Runnable. 有一点区别就是

    2024年02月12日
    浏览(33)
  • 【Java|多线程与高并发】设计模式-单例模式(饿汉式,懒汉式和静态内部类)

    设计模式是一种在软件开发中常用的解决复杂问题的方法论。它提供了一套经过验证的解决方案,用于解决特定类型问题的设计和实现。设计模式可以帮助开发人员提高代码的可重用性、可维护性和可扩展性。 设计模式有很多,本文主要介绍单例模式. 单例模式是一种创建型设

    2024年02月11日
    浏览(54)
  • qt创建线程的两种方法

    第一种:继承QThread类 方法描述 1。类MyThread继承QThread, 2。重载MyThread中的run()函数,在run()函数中写入需要执行的工作; 3。调用start()函数来启动线程。 不是真的跨线程,子线程ID和主线程ID是同一个 第二种:QObject::moveToThread 这就是我要的子线程 //用于托管我的子线程

    2024年04月27日
    浏览(40)
  • 多线程与高并发--------线程池

    在开发中,为了提升效率的操作,我们需要将一些业务采用多线程的方式去执行。 比如有一个比较大的任务,可以将任务分成几块,分别交给几个线程去执行,最终做一个汇总就可以了。 比如做业务操作时,需要发送短信或者是发送邮件,这种操作也可以基于异步的方式完

    2024年02月13日
    浏览(40)
  • 多线程与高并发——并发编程(4)

    1.1 生产者消费者概念 生产者-消费者是设计模式的一种,让生产者和消费者基于一个容器来解决强耦合的问题。生产者与消费者彼此之间不会直接通讯,而是通过一个容器(队列)进行通讯。 生产者生产完数据后扔到容器中,不用等消费者来处理; 消费者也不需要去找生产

    2024年02月10日
    浏览(47)
  • 多线程与高并发——并发编程(5)

    为什么要使用线程池? 在开发中,为了提升效率,我们需要将一些业务采用多线程的方式去执行。比如,有一个比较大的任务,可以将任务分成几块,分别交给几个线程去执行,最终做一个汇总即可。再比如,做业务操作时,需要发送短信或邮件,这些操作也可以基于异步的

    2024年02月09日
    浏览(44)
  • Python创建多线程的两种常用方法

    这篇文章主要为大家详细介绍了Python中创建多线程的两种常用方法,文中的示例代码简洁易懂,对我们掌握Python有一定的帮助,需要的可以收藏一下 经过总结,Python创建多线程主要有如下两种方法: 函数 类 接下来,我们就来揭开多线程的神秘面纱。 在Python3中,Python提供了

    2024年02月15日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包