理解interrupt()方法

2023-05-16

java interrupt()方法只是设置线程的中断标记,当对处于阻塞状态的线程调用interrupt方法时(处于阻塞状态的线程是调用sleep, wait, join 的线程),会抛出InterruptException异常,而这个异常会清除中断标记。因此,根据这两个思路,不同的run()方法设计,会导致不同的结果,下面是示例,并说明了运行了结果和原因

package com.concurrency;

import java.util.concurrent.TimeUnit;

public class Test{
    public static void main(String[] args) throws InterruptedException {
        RunTest rt = new RunTest();
        Thread t = new Thread(rt);
        t.start();
        TimeUnit.SECONDS.sleep(2);
        t.interrupt();
    }
}
//不同的run方法设计
class RunTest implements Runnable{
    //这种设计比较好,当调用阻塞操作时,会因为抛出异常退出,当不调用阻塞操作时,会因为检查中断状态而退出
    public void run1(){
        try{
            while(!Thread.interrupted()){
               // System.out.println("sleep 5s");
                //Thread.sleep(5000);接收到中断信号时,由于while循环判断不成立退出,不抛出异常
            }
            System.out.println("Exit normal");
        }catch(Exception e){
            System.out.println("interrupted");
        }
    }

    public void run5() {
        try{
            while(!Thread.interrupted()){
               // System.out.println("sleep 5s");
                Thread.sleep(5000);//接收到中断信号时,由于抛出异常退出,模拟耗时操作
            }
            System.out.println("Exit normal");
        }catch(Exception e){
            System.out.println("interrupted and exit");
        }
    }
    public void run3(){
        while(!Thread.interrupted()){
            //接收到中断信号时,由于while循环判断不成立退出
        }
        System.out.println("interrupt normal and exit 2");
    }
    //此种设计不好
    public void run4(){
        while(!Thread.interrupted()){
            try{
                TimeUnit.SECONDS.sleep(1);
                //接收到中断信号,捕获异常并清除中断状态,所以不退出,所以这种不是良好的设计方式,如果想要退出,需要在catch语句中Thread.currentThread().interrupt();
            }catch(Exception e){
                System.out.println("Interrupte and clear interrupt status, so run continue");
            }
        }
        System.out.println("exit normal 3");
    }
    public void run(){
        double d = 1;
        while(!Thread.interrupted()){
            while(d<3000){
                d = d + (Math.PI+Math.E)/d;
                System.out.println(d+ " running");
                //接收到中断信号时,不会中断正在运行的操作,只有当操作完成后,检查中断状态时会退出
            }
        }
        System.out.println("Exit "+d);
    }
}

可以将run()改为上面其中的一个,对比看看运行结果,如上面所述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解interrupt()方法 的相关文章

  • 如果我对 Thread.interrupt() 的调用不起作用,如何正确停止线程? [复制]

    这个问题在这里已经有答案了 众所周知 不应使用 Thread stop 停止正在运行的进程 通常 手册和教程建议使用 Thread interrupt 或某些布尔变量 并从代码内部检查该中断或变量 但是 如果我有一个库方法 有时需要很长时间
  • Android USB主机:异步中断传输

    我正在尝试连接 USB 设备 我自己构建 来与我的开发板 ODROID X 进行通信 不幸的是 就异步通信而言 例子很少 我在中断驱动的数据交换方面遇到了一些问题 如何使用异步中断模式建立连接 在一个方向上 传输是可能的 但在两个方向上都不
  • 内核如何通知用户空间程序中断发生

    我正在编写一个用户空间程序和一个内核空间设备驱动程序 目标 一旦发生中断 用户空间程序需要快速执行某些操作 我的天真的方法 用户空间程序使用ioctl调用wait event interruptible 内核ISR调用wake up int
  • 中断 Linux 上线程中的系统调用

    我有一个循环运行的 pthread 调用accept 以阻塞的方式 有什么办法可以中断另一个线程的调用吗 一切都指向向线程发送信号 但显然你只能发送一个process一个信号 我不能直接杀死线程 因为这样会使套接字保持打开状态 无论如何 这
  • Arduino 中断替代方案

    根据我的阅读 我的问题的解决方案是使用中断 但如果我正确理解它们 我就不能在中断调用的例程中使用延迟 我有一个大按钮LED转变 我希望它在闲置时有心跳 但一旦被推动 就保持绿色并执行代码 我可以打破heartbeat 如果我按按钮足够多次
  • 如何中断 Scanner.nextline() 调用

    SO 上有很多关于中断读取 system in 的线程 但我在这里寻找的是一些关于如何最好地编码我想要实现的目标的建议 我有一个getlogin 需要执行以下操作的方法 要求用户输入所需的登录环境详细信息 如果 6 秒后用户没有输入有效值
  • CPU 如何知道针对硬件中断运行哪个中断服务程序?

    例如 按下键盘上的按键 导致向CPU生成硬件中断 CPU向中断控制器发送确认 在中断处理阶段 CPU如何根据键盘上的按键判断运行哪个中断服务程序呢 None
  • 如何在 C 或内联汇编中设置 ARM 中断向量表分支?

    有人可以向我展示如何在没有 RTOS 或 Linux 操作系统的裸机环境中使用 C 或内联汇编设置 ARM9 中断向量表的示例吗 具体来说 如何使用内联汇编或 C 来设置用 C 编码的 IRQ 中断处理程序 ISR 的分支 timer1 6
  • 线程是否需要处于 RUNNABLE 状态才能被中断?

    java中的线程在被中断方法中断之前是否必须处于就绪状态 我尝试通过在下面输入上面给出的代码来检查这一点 class MyThread extends Thread public void run try for int i 0 i lt
  • 如何在不终止解释器的情况下中断本机扩展代码?

    我正在开发一个项目 它将用 C 编写的高性能算法与 Python 接口相结合 C 类和函数通过 Cython 编译器包装并暴露给 Python 假设我从 Python 解释器调用一个长时间运行的本机函数 我首选的是 IPython 是否有可
  • 中断 0x15 函数 0x86(BIOS WAIT)在真实硬件上的运行速度比在虚拟机上慢得多?

    我一直在汇编 游戏 中编写引导加载程序 引导加载程序使用 BIOS WAIT 函数 int 0x15 ah 0x86 来实现帧之间的延迟 我正在使用 BOCHS 进行调试 一切都运行良好 时机非常完美 我还制作了一个可启动的isoisoge
  • 如何知道Linux中特定引脚的中断/GPIO编号

    我正在做一个项目 需要在 Linux 中处理中断 我正在使用的板是基于三星的s3c6410 MCU arm 11处理器 它具有以下I O接口 如图所示 我有用于外部中断的 EINTx 引脚和用作 GPIO 引脚的 GPxx 引脚 我不介意使
  • 是否可以设置当CPU写入特定地址时中断的中断?

    当写入特定地址时是否可以使x86 cpu中断 我想要一个硬件机制来监视某些地址的变化 我想知道在写入特定地址时是否可以使x86 cpu中断 有可能的 您可以设置调试寄存器之一 DR0 to DR4 到你想要监控的地址 然后在中配置相应的标志
  • 中断屏蔽:为什么?

    我正在阅读有关中断的内容 可以通过特殊的中断屏蔽来暂停非关键中断 这称为中断屏蔽 我不知道的是您何时 为什么可能想要或需要暂时中止中断 可能是信号量 或者在多处理器环境中编程 当操作系统准备运行自己的 让我们编排世界 代码时 它就会这样做
  • 在中断例程中使用 C++ 对象(和易失性对象)的正确方法是什么?

    我目前正在使用 Atmel AVR 微控制器 gcc 但希望答案适用于一般微控制器世界 即通常是单线程但带有中断 我知道如何使用volatile在 C 代码中访问可在 ISR 中修改的变量时 例如 uint8 t g pushIndex 0
  • 如何在 DOS 汇编中正确挂接中断 28h 并恢复它?

    我试图将中断28h的处理程序设置为我自己的例程 恢复所有涉及的寄存器和标志 并恢复原始的中断处理程序 我在 VirtualBox 中的 DOSBox 和 MS DOS 6 22 下使用 NASM Assembler 我考虑过调试 但在 TS
  • 尝试了解 asm 中断,特别是 16h func 01H

    这是家庭作业 我不期望你解决我的问题 只需要一些理解 我必须在 dosbox 中使用 ASM 和 C 我的第一个问题是我不太明白如何使用 BIOS 中断 任何带有代码示例的好的教程都会非常感激 好吧 我知道有中断 每个中断都有自己的功能和参
  • 轮询和事件驱动编程是同一种技术的不同说法吗?

    我研究了中断与循环轮询 并了解了不必等待轮询的中断的优点 在我看来 轮询就像事件驱动的编程 或者至少类似于侦听器 而轮询的作用实际上很像侦听输入或输出 您同意还是我误解了轮询 循环监听 和事件驱动编程 也用所谓的监听器监听 之间的任何关键区
  • 如何在未来取消时终止 Callable 中的 CXF Web 服务调用

    Edit 这个问题现在已经经历了几次迭代 所以请随意查看修订版本 以了解有关历史和尝试过的事情的一些背景信息 我将 CompletionService 与 ExecutorService 和 Callable 一起使用 通过 CXF 生成的
  • Linux内核中断处理程序互斥保护?

    我是否需要保护我的中断处理程序被同一中断多次调用 鉴于以下代码 我不确定应该进行的系统调用 我在当前的实现中遇到了罕见的随机死锁 void interrupt handler void down interruptible sem or u

随机推荐

  • 泰勒(Taylor)展开式(泰勒级数)

    目录 泰勒公式 余项 1 佩亚诺 Peano xff09 余项 xff1a 2 施勒米尔希 罗什 Schlomilch Roche xff09 余项 xff1a 3 拉格朗日 xff08 Lagrange xff09 余项 xff1a 4
  • 【计算机视觉基础】4.仿射变换

    主要看这个哦 xff1a 马同学 xff1a 如何通俗地讲解 仿射变换 这个概念 xff1f 知乎 简单来说 xff0c 仿射变换 就是 xff1a 线性变换 43 平移 目录 1 线性变换 1 1 旋转 1 2 推移 xff08 图像学中
  • Selenium+Python自动化脚本环境搭建

    本文仅介绍环境的搭建 xff0c 不包含任何脚本编写教程 先整体说一下需要用到工具 1 Python环境 xff08 包括pip xff09 2 谷歌浏览器 xff08 包括对应的WebDriver xff09 详细步骤 xff1a 一 P
  • CUDA之nvidia-smi命令详解

    nvidia smi是用来查看GPU使用情况的 我常用这个命令判断哪几块GPU空闲 xff0c 但是最近的GPU使用状态让我很困惑 xff0c 于是把nvidia smi命令显示的GPU使用表中各个内容的具体含义解释一下 这是服务器上特斯拉
  • CMakeLists之引入头文件(五)

    1 新建项目 新建项目t4 目录结构如下 xff1a 该程序引入了自建的hello h程序库包含了函数func main c的内容如下所示 xff1a main c include lt hello h gt int main func r
  • 用HttpPost登陆验证时,用户名和密码放在请求头部header中的处理方法,形式为Authorization: username password。

    xfeff xfeff post setHeader 34 Authorization 34 34 your token 34 这里主要是要搞清楚your token是什么 xff0c 把认证信息传递正确 xff0c 这个认证信息是通过用户
  • vs code 运行C语言并调试

    vs code 运行C语言 2022 03 19 mingw64下载地址更新 xff08 window xff09 task json文件修改launch json文件修改 更新版 xff08 window xff09 1 下载MinGW编
  • 【Http认证方式】——Basic认证

    今天在访问请求 xff1a http 192 168 2 113 8080 geoserver rest workspaces时 xff0c 浏览器弹出窗口需要输入用户名和密码 xff0c 并且 xff0c 如果不输入或者输入错误 xff0
  • 大小端介绍与分析

    1 字节序 字节序即字节的存储顺序 xff0c 如果数据都是单字节的 xff0c 那怎么存储无所谓了 xff0c 但是对于多字节数据 xff0c 比如int xff0c double等 xff0c 就要考虑存储的顺序了 字节序是硬件层面的东
  • Emgu-WPF 激光雷达研究-定位实现

    特定位置或障碍物位置定位实现 读取激光雷达数据并存储于本地作为测试数据 每一帧数据对同一障碍物的定位信息均存在偏差 所以先对需要定位的点进行数据取样 取样过程中 xff0c 遇到数据丢失 xff0c 或检测到多个障碍物 不满足障碍物生存指数
  • Jetson NX性能介绍

    NX的各个工作模式及功耗 xff1a 与其他jetson系列板卡的对比
  • 移远EC200UCN_LA 4G通信模块 OpenCPU二次开发过程中遇到的各种坑

    这里主要记录一下我在使用移远开发板进行 EC200UCN LA 4G通信模块开发中遇到的各种坑 注 xff1a Q为遇到的问题 A为问题的解决办法 T为注意事项 Q 串口demo无法正常接收和发送消息 A demo里用的UART2 xff0
  • GPS数据格式解析

    GPS数据格式解析 简介 GPS发送数据以行为单位 xff0c 数据格式如下 xff1a 信息类型 xff0c x xff0c x xff0c x xff0c x xff0c x xff0c x xff0c x xff0c x xff0c
  • 线程的sleep()方法的简单使用

    线程的sleep方法签名位 xff1a public static void sleep long millis throws InterruptException 是静态方法 xff0c 使目前正在执行的线程休眠millis毫秒 pack
  • 栈和堆的生长方向

    C 43 43 作为一款C语言的升级版本 xff0c 具有非常强大的功能 它不但能够支持各种程序设计风格 xff0c 而且还具有C语言的所有功能 我们在这里为大家介绍的是其中一个比较重要的内容 xff0c C 43 43 内存区域的基本介绍
  • mysql关于bit类型用法

    本文来源于 xff1a http www server110 com mysql 201403 7117 html Mysql关于bit类型的用法 xff1a 官方的资料如下 xff1a 9 1 5 位字段值 可以使用b 39 value
  • Ajax 简单购物车工程

    工程结构图 xff1a index jsp lt 64 page language 61 34 java 34 contentType 61 34 text html charset 61 utf 8 34 pageEncoding 61
  • Oracle scott账户被锁定,scott默认密码,sys,system默认密码

    oracle帐号scott被锁定如何解锁 具体操作步骤如下 xff1a C gt sqlplus 请输入用户名 xff1a sys 输入口令 xff1a sys as sysdba 注意 xff1a 在口令这里输入 的密码后面必须要跟上 a
  • Linux将输出放到文件中

    一 xff0c 如何把命令运行的结果保存到文件当中 这个问题太简单了 xff0c 大家都知道 xff0c 用 gt 把输出转向就可以了 例子 lhd 64 hongdi ls gt ls txt lhd 64 hongdi cat ls t
  • 理解interrupt()方法

    java interrupt 方法只是设置线程的中断标记 xff0c 当对处于阻塞状态的线程调用interrupt方法时 xff08 处于阻塞状态的线程是调用sleep wait join 的线程 xff0c 会抛出InterruptExc