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

简介: 线程中断是指在一个线程执行的过程中,强制终止该线程的执行。虽说是中断,但本质上是让run方法快点执行完,而不是run方法执行到一半,强制结束.

1.前言

线程中断是指在一个线程执行的过程中,强制终止该线程的执行。虽说是中断,但本质上是让run方法快点执行完,而不是run方法执行到一半,强制结束.

本文主要介绍线程中断的两种方法



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;
    }
}

运行结果:

2faf462a6f81454c85899afda4e933ac.png


看下面这张图:


478b2e29937d4d429d481ea5431422fe.png

在这段代码中,定义了一个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();
    }
}


但是这么写,会有问题


687eff1d74134149909951537ca1c9c9.png

能看到,这里抛出了一个异常.而且虽然设置标志位,但是线程并没有结束.

注意interrupt方法有两种行为:


1.如果线程是正常状态,会设置标志位为true

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

如果想要结束循环,可以在catch中加上break


1c8332c4e3cd41448e0ebd0af1e2eb6d.png


4.总结

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

c61380faf0de4f7f93fb8039975b2029.gif


感谢你的观看!希望这篇文章能帮到你!

专栏: 《从零开始的Java学习之旅》在不断更新中,欢迎订阅!

“愿与君共勉,携手共进!”


8fbf2a7f2d0e4db782e58035677a303d.png

相关文章
|
9月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
429 1
|
9月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
396 1
|
10月前
|
存储 Oracle Java
|
10月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
443 0
|
10月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
617 16
|
9月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
806 0
|
9月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
332 6
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
499 83
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
451 0