当前位置: 首页 > news >正文

JDK8和JDK17 Thread.interrupt() 实现区别

一、Interrupt打断阻塞

以下相同的代码分别在JDK8和JDK17中执行会得到不同的结果,基于两个不同的实现版本源码是不一样的,JDK17在调用interrupt方法时会将interrupted设置为true,JDK8不会进行设置。当前线程在调用sleep()、wait()、join()方法时被阻塞,则其中断状态将被清除,并且将会抛出InterruptedException

package com.kh.JUC;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Interrupt {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            log.info("sleep");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }, "t");
        t.start();
        Thread.sleep(1000); // 不进行sleep的话会先执行main线程的输出再执行t线程
        log.info("Interrupt");
        t.interrupt();
        log.info("Is Interrupt: " + t.isInterrupted());
    }
}

二、JDK8执行结果

三、JDK17执行结果:

四、JDK8实现

五、JDK17实现

该方法用于中断线程。主要逻辑如下:
检查当前线程是否有权限中断目标线程,若无权限则抛出SecurityException。
如果线程在等待或阻塞状态,清除中断状态并抛出InterruptedException。
如果线程在I/O操作上被阻塞,则关闭通道并设置中断状态。
如果线程在选择器上被阻塞,则立即返回并设置中断状态。
如果以上条件都不满足,则仅设置中断状态。

相关文章:

  • 软件综合实践微人事管理信息系统+燃气站信息管理系统+mapbox地图(实际上使用的高德地图开发)
  • 深度学习GRU模型原理
  • 【Academy】服务器端模板注入 ------ Server-side template injection
  • k8s面经
  • Elasticsearch-07-Elasticsearch Java API Client-Elasticsearch 8.0 的高阶api
  • Jmeter 测试一个网站的并发量
  • PHP 在 if 判断时由于运算符优先级导致 false 的问题
  • 【具身相关】legged_gym, isaacgym、rsl_rl关系梳理
  • Qt表格美化笔记
  • 华为OD机试-求字符串中所有整数的最小和-逻辑分析(Java 2023 B卷 100分)
  • AGI大模型(2):GPT:Generative Pre-trained Transformer
  • 【Godot4.3】RenderingServer总结
  • 安装 MongoDB 的步骤(Windows / macOS / Linux)
  • 联合中存储平方差
  • FPGA 实现 OV5640 摄像头视频图像显示
  • 【spring】springAOP
  • navicat16 升级到 navicat17 之后原来的连接找不到了 mac用户
  • 侯捷 C++ 课程学习笔记:进阶语法之lambda表达式(二)
  • 利用8个参数定义一个汽轮机,然后根据这8个参数生成汽轮机性能试验时的测点清单-pycharm-源代码(适用所有类型汽轮机)
  • 【搜索页】- 功能流程
  • 存款利率、LPR同日下调,机构称对银行的影响偏正面
  • 首付款12.5亿美元!三生制药与辉瑞就国产双抗达成合作协议
  • 解读|俄方称愿与乌方共同起草和平备忘录,特朗普多轮通话外交有效吗?
  • 浙江推动人工智能终端消费:家居机器人纳入以旧换新补贴范围
  • 特写|银耳种植“北移”到沧州盐山,村民入伙可年增收4万元
  • 人民网:激发博物馆创新活力,让“过去”拥有“未来”