JNI-从jvm源码分析Thread.interrupt的系统级别线程打断原理

本文探讨了Java中线程打断的原理,从`Thread.interrupt`的使用特点到JVM层面的实现。通过分析JVM源码,揭示了`interrupt`方法如何设置线程的打断标志并唤醒线程。同时,介绍了`ParkEvent`和`Park()`对象在系统层面如何利用锁和条件变量实现线程挂起和唤醒。最后,通过JNI实现了一个可打断的`MyThread`类来巩固理解。
摘要由CSDN通过智能技术生成

前言

在java编程中,我们经常会调用Thread.sleep()方法使得线程停止运行一段时间,而Thread类中也提供了interrupt方法供我们去主动打断一个线程。那么线程挂起和打断的本质究竟是什么,本文就此问题作一个探究。

本文主要分为以下几个部分

1.interrupt的使用特点

2.jvm层面上interrupt方法的本质

3.ParkEvent对象的本质

4.Park()对象的本质

5.利用jni实现一个可以被打断的MyThread类

1.interrupt的使用特点

我们先看2个线程打断的示例

首先是可打断的情况:

@Test
public void interruptedTest() throws InterruptedException {
   
    Thread sleep = new Thread(() -> {
   
        try {
   
            log.info("sleep thread start");
            TimeUnit.SECONDS.sleep(1);
            log.info("sleep thread end");
        } catch (InterruptedException e) {
   
            log.info("sleep thread interrupted");
        }
    }, "sleep_thread");
    sleep.start();

    TimeUnit.MILLISECONDS.sleep(100);
    log.info("ready to interrupt sleep");
    sleep.interrupt();
}

我们创建了一个“sleep”线程,其中调用了会抛出InterruptedException异常的sleep方法。“sleep”线程启动100毫秒后,主线程调用其打断方法,此时输出如下:

09:50:39.312 [sleep_thread] INFO cn.tera.thread.ThreadTest - sleep thread start
09:50:39.412 [main] INFO cn.tera.thread.ThreadTest - ready to interrupt sleep
09:50:39.412 [sleep_thread] INFO cn.tera.thread.ThreadTest - sleep thread interrupted

可以看到“sleep”线程被打断后,抛出了InterruptedException异常,并直接进入了catch的逻辑。

接着我们看一个不可打断的情况:

@Test
public void normalTest() throws InterruptedException {
   
    Thread normal = new Thread(() -> {
   
        log
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值