并发——中断机制

news2024/11/25 7:41:56

1.中断概述

中断只是一种协商机制,如果要中断一个线程,需要手动调用该线程的interrupt方法,将此线程对象的中断标识设为true(默认中断标志位为false),接着我们需要手动写代码去不断的检测要中断线程的标识位,如果为true,表示别的线程请求将这条线程中断。所以说一个线程的命运是掌握在自己手中的。

2.中断的相关API——三大方法

3.面试常考题

3.1如何停止并中断运行中的线程?

  • 通过volatile修饰变量来实现,volatile具有可见性,别的线程修改其共用的变量来协商中断线程。

  • 使用原子类AtomicBoolean实现,也是通过别的线程修改其中的boolean类型的变量来协商中断线程。

  • 通过Thread类中自带的中断API实现,利用interrupt() 和isInterrupted()方法,要求在中断的线程中需要不断的监听中断标志位的状态。 

public class InterruptDemo {

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            while (true) {
                if (Thread.currentThread().isInterrupted()) { //自己不断的循环判断
                    System.out.println(Thread.currentThread().getName() + " isInterrupted()的值被改为true,t1程序停止");
                    break;
                }
                System.out.println("-----------hello isInterrupted()");
            }
        }, "t1");
        t1.start();

        try {
            TimeUnit.MILLISECONDS.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //t2向t1放出协商,将t1中的中断标识位设为true,希望t1停下来
        new Thread(() -> t1.interrupt(), "t2").start();

        //当然,也可以t1自行设置
        //t1.interrupt();

    }
}
/**
 * -----------hello isInterrupted()
 * -----------hello isInterrupted()
 * -----------hello isInterrupted()
 * -----------hello isInterrupted()
 * t1 isInterrupted()的值被改为true,t1程序停止
 */

3.2线程的中断标识为true,是不是被设置线程就立刻停止了?

并不是立刻停止,具体来说,当调用需要中断线程的Interrupt()方法时,有以下两种情况:

  • 如果此线程正处于正常的活动状态,那么就会设置线程的中断标志位为true,仅此而已,线程还会继续不受影响的运行。

  • 如果此线程正处于阻塞的状态(例如sleep,wait等),那么该线程将立刻退出被阻塞的状态,并且清除Interrupt的状态(设置为false),并且抛出一个InterruptedException异常

总之,中断只是一种协商机制,修改中断标识位仅此而已,并不是立刻stop打断。

3.3静态方法Thread.interrupted(),谈谈你的理解?

此方法是一个静态方法,该方法的含义是返回此线程的中断标志位的状态,并且清空中断标识位(设置为false)。这就可能会导致连续两次调用此方法,而返回回来的结果却不一致。

3.4对于interrupted()和isInterrupted()的共同点和区别?

共同点:

  • 都能返回此刻线程标志位的状态。

  • 调用的都是本地(native)的isInterrupted(boolean ClearInterrupted)方法。

区别:

  • interrupted()方法是静态方法,isInterrupted()方法是实例方法。

  • interrupted()方法会清空中断标志位状态(传入参数true),而isInterrupted()方法不会(传入参数false)。

 

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

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

相关文章

阿木实验室PrometheusV1.1安装+Ubuntu 20.04

1. 安装ros-noetic 2. 安装Mavros包 sudo apt-get install ros-noetic-mavros ros-noetic-mavros-extras3. GeographicLib wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh这里可以使用代理 :wg…

笔训day1

目录 选择题 1、%m.ns 编程题 第一题 第二题 选择题 1、%m.ns m:字符串的宽度。 n:左起截取目标字符串n个字符,右对齐,补空格。 1、字符串长度>n>m : 受n控制,左起截取n个字符,右对齐&#x…

什么是Times New Roman 字体

如何评价 Times New Roman 字体?:https://www.zhihu.com/question/24614549?sortcreated 新罗马字体是Times New Roman字体,是Office Word默认自带的英文字体之一。 中英文字体 写作中,英文和数字的标准字体为 Times New Roma…

什么是AI客流量算法?如何应用在实际场景中?

客流量分析算法简而言之就是一种利用数据分析和机器学习技术进行人流量统计、预测和分析的算法。它能够根据不同的数据来源,如摄像头、传感器等,对特定区域内的客流量进行实时监测和分析,并通过对历史数据的综合分析,提供客流趋势…

MySQL索引优化,设计原则 及 trace 详解(思维导图)

MySQL版本:8.0.33 MySQL联合索引使用总结:

基于 Python+Django 实现一个电商购物网站系统

随着互联网的高速发展,电子商务行业也正迎来了其黄金时代。如何搭建一个功能完备、体验良好的电商网站成了许多开发者的关心话题。 今天,我将带大家使用Python语言和Django框架,快速打造一个电商购物系统。如果你有一定的Python基础&#xf…

轻松批量重命名:使用编号为文件重新命名,提高工作效率!

如果你经常需要处理大量文件,那么你一定知道给文件重命名是一项多么繁琐的任务。但是,我们今天将为你提供一种简单的方法,可以批量给文件进行重命名,让你轻松提高工作效率 首先我们要进入文件批量改名高手主页面,并在…

px4的gazebo仿真相机模型报错解决办法,返回值256

👉事情起因:我想做关于PX4无人机的摄像头仿真,根据PX4的官网文件 Tools/sitl_gazebo文件夹里面有对应的模型可以使用,我就想在mavros_posix_sitl文件里面修改vehicle参数,比如直接将vehicle“iris_stereo_camera”。然…

C++核心编程--对象篇

4.2、对象 4.2.1、对象的初始化和清理 用于对对象进行初始化设置,以及对象销毁前的清理数据的设置。 构造函数和析构函数 防止对象初始化和清理也是非常重要的安全问题 一个对象或变量没有初始化状态,对其使用后果是未知的同样使用完一个对象或变量&…

【Java 进阶篇】MySQL 多表查询详解

MySQL 是一个强大的关系型数据库管理系统,多表查询是数据库操作中的重要部分之一。多表查询允许您从多个表中检索和操作数据,以满足复杂的数据需求。本文将介绍 MySQL 多表查询的基本概念、语法和示例,以及一些常见的多表查询场景。 什么是多…

PC版企业微信逆向之消息发送CALL-找不到参数文本消息内容,但是确定这就是消息发送CALL

现在遇到的问题是消息内容-如何查看通过esi里面的消息内容,找不到有效的 找不到参数文本消息内容,但是确定这就是消息发送CALL 消息发送call特征码为8d 47 08 50 56 e8 ?? ?? ?? ?? 8b 07 //消息发送CALL如下 **02852932 8B07 mov eax,dword ptr…

进度条程序的编写

目录 回车换行和换行的区别 倒计时程序 进度条程序 进度条代码的优化 version2 进度条代码的优化version3 在编写进度条程序之前我们需要先了解一个概念:回车换行和换行的区别。 回车换行和换行的区别 刚听到的时候会很好奇,回车换行和换行有什么区别吗&…

【数据结构】树、二叉树的概念和二叉树的顺序结构及实现

目录 前言:一、树的概念及结构1.树的概念2.树的相关概念3.树的存储4.树在实际中的运用 二、二叉树概念及结构1.概念2.特殊的二叉树(1)满二叉树(2)完全二叉树 3.二叉树的性质4.二叉树的存储(1)顺序存储(2)链式存储 三、…

山西电力市场日前价格预测【2023-09-30】

日前价格预测 预测说明: 如上图所示,预测明日(2023-09-30)山西电力市场全天平均日前电价为267.99元/MWh。其中,最高日前电价为485.05元/MWh,预计出现在18: 45。最低日前电价为0.00元/MWh,预计出…

手机搜狗输入法,输入拼音时如何分割拼音,调出“分词“功能,如何微信或QQ使用发送按钮而不是换行?

背景 有时候打字,输入 “xian” 的时候我们的意图是 “xi’an” (西安),或者输入 “yue” 的时候希望是 “yu’e”(余额) 如何输入这个分隔符 ’ 呢? 设置方法 默认页面如图 希望设置成 点…

python安装第三方模块方法

正常情况下安装python第三方模块没啥说的,但是由于python安装模块默认是在外网下载安装,牵扯外网网速问题,所以可以配置下使用国内某镜像源来下载模块 python -m pip install xxxxxxxxxxx 和 pip install xxxxxxxxxx 的命令都可下载安装第三…

Junit单元测试为什么不能有返回值?

这个问题的产生来源于我们老师上节课说的我们班一个男生问他的想法,刚开始听到这个还觉得挺有意思,我之前使用单元测试好像下意识的就将它的返回值写为void,一般都是进行简单的测试,也从没思考过在某个单元测试中调用另一个单元测试&#xff…

2023年【起重信号司索工(建筑特殊工种)】考试总结及起重信号司索工(建筑特殊工种)模拟考试题

题库来源:安全生产模拟考试一点通公众号小程序 起重信号司索工(建筑特殊工种)考试总结是安全生产模拟考试一点通生成的,起重信号司索工(建筑特殊工种)证模拟考试题库是根据起重信号司索工(建筑特殊工种)最新版教材汇编出起重信号司索工(建筑特殊工种)仿…

Muduo网络库之Channel、EPollPoller与EventLoop类【深度解析】

文章目录 前言一、Channel类1、主要成员变量以及函数2、实现原理 二、EPollPoller类1、实现原理 二、EventLoop类1、功能实现SubReactorde的唤醒操作 前言 重新梳理一遍muduo网络库的类与知识点。 Channel、EPollPoller与EventLoop类是muduo库最重要的基础, 他们三…

python-切换镜像源和使用PyCharm进行第三方开源包安装

文章目录 前言python-切换镜像源和使用PyCharm进行第三方开源包安装1. 切换镜像源2. 使用PyCharm进行第三方开源包安装 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每…