线程的“打断”

news2025/7/12 15:17:27

【打断线程的三个方法】:

 //Thread.java  
public void interrupt()              //t.interrupt() 打断t线程(设置t线程某给标志位f=true,并不是打断线程的运行)
public boolean isInterrupted()       //t.isInterrupted() 查询打断标志位是否被设置(是不是曾经被打断过)
public static boolean interrupted()  //Thread.interrupted() 查看“当前”线程是否被打断,如果被打断,恢复标志位( 自动设回false )
  1. interrupt() :实例方法,设置线程中断标志(打扰一下,你该处理一下中断)
  2. isInterrupted():实例方法,有没有人打扰我?
  3. interrupted():静态方法,有没有人打扰我(当前线程)?复位!

【总结】:
interrupt—————设标志位。
isInterrupted———查标志位。
interrupted————查标志位 并 重置。

【 interrupt & isInterrupted 】:

/**
 * interrupt()与isInterrupted()
 * 设置标志位 + 查询标志位
 */
public class T05_Interrupt_and_isInterrupted {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            for (; ; ) {
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("Thread is interrupted!");
                    System.out.println(Thread.currentThread().isInterrupted());
                    break;
                }
            }
        });

        t.start();

        SleepHelper.sleepSeconds(2);

        t.interrupt(); //两秒钟之后设置中断标志位。
    }
}

【最终输出】:

【线程结束的方案】:
我这个线程里面会隔一段儿时间 , 我就去检查一下有没有设置过我的标志位,如果被设置了,那么,我就可以让线程结束。

【 Interrupt & interrupted 】:

/**
 * interrupt与interrupted()
 */
public class T06_Interrupt_and_interrupted {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            for (; ; ) {
                if (Thread.interrupted()) {
                    System.out.println("Thread is interrupted!");
                    System.out.println(Thread.interrupted());
                }
            }
        });

        t.start();

        SleepHelper.sleepSeconds(2);

        t.interrupt();

        //思考一下,如果在这里写
        System.out.println("main: " + t.interrupted());  //在这里访问的时候,当前线程是主线程 Main。
        //interrupted这个方法是静态成员变量,永远拿的都是当前线程。
        //输出的是哪个线程的中断状态
    }
}

【 interrupt & sleep 】:

/**
 * interrupt与sleep() wait() join()
 */
public class T07_Interrupt_and_sleep {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            try {
                Thread.sleep(10000);   // 用interrupt打断这三个( sleep、wait、join )的话——会抛出异常( InterruptedException )
                //你必须对异常进行处理。
            } catch (InterruptedException e) {  //只要catch , 它就会进行复位。
                //一旦抛出InterruptedException异常 , Java会自动帮你把标志位进行复位。

                System.out.println("Thread is interrupted!");
                System.out.println(Thread.currentThread().isInterrupted());
            }
        });

        t.start();

        SleepHelper.sleepSeconds(5);

        t.interrupt();  //设中断标志位的时候,这个线程正在sleep 。
    }
}

【最终输出】:
在这里插入图片描述

【 interrupt & wait 】:

/**
 * interrupt与sleep() wait() join()
 */
public class T08_Interrupt_and_wait {

    private static Object o = new Object();

    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            synchronized (o) {
                try {
                    o.wait();
                } catch (InterruptedException e) {
                    System.out.println("Thread is interrupted!");
                    System.out.println(Thread.currentThread().isInterrupted());
                }
            }
        });

        t.start();

        SleepHelper.sleepSeconds(5);

        t.interrupt();
    }
}

【最终输出】:
在这里插入图片描述

【 Interrupt_and_synchronized 】:

设置标志位,这一件事情,能否把正在竞争锁的状态给打断?——不会的,不再在这个时候抛异常。

/**
 * interrupt与sleep() wait() join()
 */
public class T09_Interrupt_and_sync {

    private static Object o = new Object();

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            synchronized (o) {  //拿到这把锁~ ~ ~ ! ! !
                SleepHelper.sleepSeconds(10);  // 10秒内 这把锁归 t1 所有。
            }
        });

        t1.start();

        SleepHelper.sleepSeconds(1);  //主线程1秒之后启动 t2。

        Thread t2 = new Thread(() -> {
            synchronized (o) {
                //抢锁。
            }
            System.out.println("t2 end!");
        });

        t2.start();

        SleepHelper.sleepSeconds(1);  

        t2.interrupt();
    }
}

【最终结果】:
依然是在8秒之后,打印下图内容( 不会抛异常,也不会干别的 ):
在这里插入图片描述
总而言之,锁竞争的过程是不会被interrupt干扰的。

【 Interrupt_and_lock 】:

import java.util.concurrent.locks.ReentrantLock;

/**
 * interrupt与sleep() wait() join()
 */
public class T10_Interrupt_and_lock {

    private static ReentrantLock lock = new ReentrantLock();

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            lock.lock();
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
            System.out.println("t1 end!");
        });

        t1.start();

        SleepHelper.sleepSeconds(1);


        Thread t2 = new Thread(() -> {
            lock.lock();
            try {
            } finally {
                lock.unlock();
            }
            System.out.println("t2 end!");
        });

        t2.start();

        SleepHelper.sleepSeconds(1);

        t2.interrupt();
    }
}

【最终输出】:
等待十秒左右,输出下图内容:
在这里插入图片描述
【总结】:
如果有一个线程占有了一把锁,并且老是不释放。另外一个线程去申请这把锁的时候,中间过程是干扰不到的。如果想干扰到的话,就要了解synchronized和ReentrantLock的区别了。

【 Interrupt_and_lockInterruptibly 】:

如果你想打断一个锁争抢的过程,那么就用——ReentrantLock。

import java.util.concurrent.locks.ReentrantLock;

/**
 * interrupt与lockInterruptibly()
 */
public class T11_Interrupt_and_lockInterruptibly {

    private static ReentrantLock lock = new ReentrantLock();

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            lock.lock();
            try {
                SleepHelper.sleepSeconds(10);
            } finally {
                lock.unlock();
            }
            System.out.println("t1 end!");
        });

        t1.start();

        SleepHelper.sleepSeconds(1);


        Thread t2 = new Thread(() -> {
            System.out.println("t2 start!");
            try {
                lock.lockInterruptibly();  //允许interrupt去干扰抢锁过程。
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
            System.out.println("t2 end!");
        });

        t2.start();

        SleepHelper.sleepSeconds(1);

        t2.interrupt();

    }
}

【最终输出】:
在这里插入图片描述

【总结】:

interrupt和sleep() wait() join()

sleep()方法在睡眠的时候,不到时间是没有办法叫醒的,这个时候可以用interrupt设置标志位,然后呢必须得catch InterruptedException来进行处理,决定继续睡或者是别的逻辑,(自动进行中断标志复位)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/8675.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程池源码解析 1.前导_FutureTask源码解析

线程池—FutureTask源码解析 简介 在学习线程池之前,需要先学习一下 FutureTask,因为线程池 submit 的结果就是 FutureTask。 那么什么是 FutureTask,其表示一个未来的任务。也就是说这个任务比较耗时,当前调用线程会阻塞拿到这…

某程序员发现 CSDN官方“漏洞”,立省¥10000+,抓紧薅吧

是一个省钱的组织!!!它叫做勤学会,CSDN 官方背书。 打开这篇博客,你首先就要面对一个问题。 勤学会到底是什么?活动?社区?还是一个名词。 今天这篇博客就从解释【勤学会】这三个字开…

【Wins+VSCode】配置C++开发环境

目录1、安装vscode2、安装中文包和c扩展包3、安装c编译工具:g4、运行代码测试5、lauch.json6、tasks.json7、问题7.1、找不到gcc任务Reference1、安装vscode 官网下载就可以了,免费的: https://code.visualstudio.com/ 2、安装中文包和c扩展…

【Java项目】讲讲我用Java爬虫获取LOL英雄数据与图片(附源码)

🚀用Java爬一下英雄联盟数据 📓推荐网站(不断完善中):个人博客 📌个人主页:个人主页 👉相关专栏:CSDN专栏 🏝立志赚钱,干活想躺,瞎分享的摸鱼工程师一枚 &…

【Asesprite】快速自制Tileset瓦片地图集(俯视角)

使用Aseprite软件完成一个Tileset素材的制作,用于2D游戏开发。 目录 一、基础配置 二、草地和泥土 三、导出为TileSet素材 一、基础配置 1.创建一个96x48的画布。 2.在菜单中选择View-》GridSettings。 3.设置网格宽高为16x16。 4.点击View-》Show-》Grid显…

IOS手机和车机互联自动化测试

在酷热的夏天,提前打开空调;在寒冷的冬天,提前加热座椅和方向盘。这些贴心的功能都是通过手机远程控制汽车实现的。随着汽车新四化的进程推进,类似手机和车机连接的功能必然越来越多。 作为汽车行业的工程师,我们都知道…

Jenkins 忘记登录密码解决办法

今天给大家分享下 jenkins 登录密码忘记的解决办法,方法不唯一,都能解决问题,按照自己的习惯来做更好。 1、先停止 jenkins 服务 systemctl stop jenkins 此步骤可以结合 ps -ef | grep jenkins 和 kill -9 jenkins进程号 一起解决2、找到…

简单实用的Python图像处理库Pillow

Pillow图像处理Pillow 库的安装图象处理基本知识图像的RGB 色彩模式像素阵列Image 模块打开和新建混合透明度混合处理遮罩混合处理复制和缩放复制图像缩放像素缩放图像粘贴和裁剪粘贴裁剪图像图像旋转格式转换covert()transpose()分离和合并分离合并滤镜其他内置函数ImageFilte…

A Blockchain-Driven IIoT Traffic Classification Service for Edge Computing 论文学习

A Blockchain-Driven IIoT Traffic Classification Service for Edge Computing IEEE INTERNET OF THINGS JOURNAL,2021 文章目录A Blockchain-Driven IIoT Traffic Classification Service for Edge ComputingSummaryResearch Objective(s)Background / Problem S…

用Canvas绘制一个数字键盘

Hello啊老铁们,这篇文章还是阐述自定义View相关的内容,用Canvas轻轻松松搞一个数字键盘,本身没什么难度,这种效果实现的方式也是多种多样,这篇只是其中的一种,要说本篇有什么特别之处,可能就是纯…

OpenGL 灰度图

目录 一.OpenGL 灰度图 1.IOS Object-C 版本1.Windows OpenGL ES 版本2.Windows OpenGL 版本 二.OpenGL 灰度图 GLSL Shader三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 &…

振弦采集模块AABB 通讯协议

振弦采集模块AABB 通讯协议 AABB 通讯协议是一种非标准自定义协议, 相较于 MODBUS 通讯协议,结构更简单,指令生成方法更容易,便于进行快速测试。 AABB 通讯协议支持单寄存器读写两种指令。 ( 1) 读取单个寄…

《Care Bears 爱心熊》人物化身来到 The Sandbox 元宇宙!

无论你想要快乐、和谐、幸运还是温暖,都会有一个适合你的爱心熊人物化身!🐻 想成为一只爱心熊吗? 《爱心熊》作品集是由 3060 个独特的 The Sandbox 人物化身组成的作品集,可在欢快而多彩的元宇宙世界中玩耍。每个人物…

【Linux】软件包管理器yum和编辑器vim(内附动图)

大家好我是沐曦希💕 文章目录1.Linux 软件包管理器 yum1.1 什么是软件包1.2 第一个软件rzsz2.Linux编辑器-vim使用2.1 vim的基本概念2.2 vim的基本操作2.3 命令模式2.3.1 光标定位2.3.2 文本复制2.4 插入模式2.5 底行模式2.5.1 调用和取消行号2.5.2 底行&#xff01…

Node.js | 详解 Cookie-Session登录验证 的工作原理

🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 🖥️ 本系列专栏:Node.js从入门到精通 👉 你的一键三连是我更新的最大动力❤️! 📢 欢迎私信博主加入前端交流群🌹 …

Maven版本3.6.1环境配置安装

官网下载安装包配置maven环境变量配置本地仓库以及阿里云镜像官网下载安装包 下载maven安装包官网地址,解压即可使用,推荐下载apache-maven-3.6.1-bin.zip 配置maven环境变量 找到此电脑右键-->点击属性-->选择高级系统设置-->点击环境变量--&g…

EPICS记录参考--计算输出记录(calcout)

计算输出或"Calcout"记录类似于Calc记录,其增加了能够输出的特性(一个"output link"和一个"output event"),根据计算结果条件地执行它们。这种特性允许在一个EPICS数据库内实现了条件分支(例如:只在Record_B有…

BERT预训练模型学习笔记

1.Transforme 1.1 要做一件什么事 基本组成依旧是机器翻译模型中常见的Seq2Seq网络输入输出都很直观,其核心架构就是中间的网络设计了MxN,输入M,输出N 1.2 传统的RNN网络有什么问题 传统RNN是一个时序模型,下一个RNN的输入依靠…

野火FPGA入门(4):时序逻辑电路

文章目录第11讲:寄存器第12讲:阻塞赋值与非阻塞赋值第13讲:计数器第14讲:分频器:偶分频第15讲:分频器:奇分频第16讲:按键消抖组合逻辑存在竞争冒险 第11讲:寄存器 寄存…

【Debug】关于 nginx 上传文件时出现 413 及 500 错误码解决方法

先简单介绍一下 Nginx…   Nginx 作为一个高性能的 HTTP 和 反向代理 web 服务器具有占用内存少, 并发能力强等特点,可以说 Nginx 专为性能和效率而生, 如 tomcat 的并发量大约在 100 多, 而 Nginx 的并发量可以达到 5 万之多;   Nginx 的主要作用还是反向代理, 实现负载均衡…