首页 > 其他分享 >中断机制之中断协商案例深度解析 上

中断机制之中断协商案例深度解析 上

时间:2024-01-21 16:55:41浏览次数:22  
标签:中断 t1 --- 案例 线程 interrupt 解析 true

说明

具体来说,当一个线程调用interrupt()时:

  • 如果线程处于正常活动状态,那么会将该线程的中断标志设置为true ,仅此而已。被设置中断标志的线程将继续正常运行,不受影响。所以,innerupt()并不能真正的中断线程,需要被调用的线程自己进行配合才行。
  • 如果线程处于被阻塞状态(例如处于sleep ,wait,join等状态) ,在别的线程中调用当前线程对象的interrupt方法,那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。

案例

实例方法interrupt()仅仅是设置线程的中断状态位为true,不会停止线程

package com.kwfruit.thread.interruptdemo;

import java.util.concurrent.TimeUnit;

public class InterruptDemo2 {


    public static void main(String[] args) {
        //实例方法interrupt()仅仅是设置线程的中断状态位为true,不会停止线程

        Thread t1 = new Thread(()->{

            for (int i =1;i<=300;i++){
                System.out.println("---"+i);
            }

            System.out.println("t1 调用interrupt()后的中断标识02:"+Thread.currentThread().isInterrupted()); //true


        },"t1");
        t1.start();

        System.out.println("t1 线程默认的中断标识:"+t1.isInterrupted()); //false


        try {
            TimeUnit.MILLISECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t1.interrupt();//true
        System.out.println("t1 调用interrupt()后的中断标识01:"+t1.isInterrupted()); //true



    }

}


t1 线程默认的中断标识:false
---1
---2
太长了省略
---136
---137
t1 调用interrupt()后的中断标识01:true
---138
---139
---140
太长了省略
---300
t1 调用interrupt()后的中断标识02:true

Process finished with exit code 0


小总结:'t1 调用interrupt()后的中断标识02:true' 这句话能正常输出,说明程序正常运行完毕,并没有中断调 所以验证了实例方法interrupt()仅仅是设置线程的中断状态位为true,不会停止线程

中断不活动的线程不会产生任何影响

package com.kwfruit.thread.interruptdemo;

import java.util.concurrent.TimeUnit;

public class InterruptDemo2 {


    public static void main(String[] args) {
        //实例方法interrupt()仅仅是设置线程的中断状态位为true,不会停止线程

        Thread t1 = new Thread(()->{

            for (int i =1;i<=300;i++){
                System.out.println("---"+i);
            }

            System.out.println("t1 调用interrupt()后的中断标识02:"+Thread.currentThread().isInterrupted()); //true


        },"t1");
        t1.start();

        System.out.println("t1 线程默认的中断标识:"+t1.isInterrupted()); //false


        try {
            TimeUnit.MILLISECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t1.interrupt();//true
        System.out.println("t1 调用interrupt()后的中断标识01:"+t1.isInterrupted()); //true

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

        System.out.println("t1 调用interrupt()后的中断标识03:"+t1.isInterrupted()); //false

    }

}


t1 线程默认的中断标识:false
---1
---2
太长了省略
---136
---137
t1 调用interrupt()后的中断标识01:true
---138
---139
---140
太长了省略
---300
t1 调用interrupt()后的中断标识02:true
t1 调用interrupt()后的中断标识03:false

Process finished with exit code 0


小总结:上面程序2000ms之后 程序早已运行完毕 中断标识变为了false 验证了 中断不活动的线程不会产生任何影响

标签:中断,t1,---,案例,线程,interrupt,解析,true
From: https://www.cnblogs.com/mangoubiubiu/p/17978021

相关文章

  • C++ const 全局变量跨文件引用,无法解析的外部符号?
    前两天群里有人问了这样一个问题:在a文件中定义了一个全局变量,可以在b文件中引用。但一旦把全局变量改为const之后,就无法在b文件中引用,编译(链接)报错“无法解析的外部符号”,这是为什么?这是因为const修饰的变量默认具有文件作用域,如果想和非const变量一样具有全局作......
  • Feign源码解析7:nacos loadbalancer不支持静态ip的负载均衡
    背景在feign中,一般是通过eureka、nacos等获取服务实例,但有时候调用一些服务时,人家给的是ip或域名,我们这时候还能用Feign这一套吗?可以的。有两种方式,一种是直接指定url:这种是服务端自己会保证高可用、负载均衡那些。但也可能对方给了多个url(一般不会这样,但是在app场景下,为了......
  • 从方法论到最佳实践,深度解析企业云原生 DevSecOps 体系构建
    作者:匡大虎引言安全一直是企业上云关注的核心问题。随着云原生对云计算基础设施和企业应用架构的重定义,传统的企业安全防护架构已经不能够满足新时期下的安全防护要求。为此企业安全人员需要针对云原生时代的安全挑战重新进行系统性的威胁分析并构建适合企业自身的威胁情报系统,......
  • 中断机制之通过interrupt实现线程中断停止
    如何停止中断运行中的线程?首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了interrupt实现线程中断停止用isInterrupted判断当前线程是否被中断,用interrupt()设置线......
  • 中断机制之通过AtomicBoolean实现线程中断停止
    如何停止中断运行中的线程?首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了AtomicBoolean实现线程中断演示通过修改共享变量的方式来达到通知的目的从而使目的线程......
  • 中断机制之通过volatile实现线程中断停止
    如何停止中断运行中的线程?首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了volatile实现线程中断演示通过修改共享变量的方式来达到通知的目的从而使目的线程中断......
  • JUC并发编程 线程中断介绍及相关Api方法
    什么是中断机制首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了其次,在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供......
  • springboot整合springSecurity入门案例(实现登录,记住我等常用标签使用)
    一,整合进依赖每个依赖都标了注释,大家可以按照自己需要的来添加,置于配置问件啥的,大家可以参考springboot+mybatisplus+redis整合(附上脚手架完整代码)<!--主要就是加了这个依赖--><dependency><groupId>org.springframework.security</groupId><artifact......
  • mybatis一对多,多对一经典案例及优缺点分析
    准备数据新建俩张表(student表,clalss表)sql语句如下:createtablestudent(sIdintprimarykeyauto_increment,sNamevarchar(20)notnull,cIdintnotnull,constraintf_sid_cidforeignkey(cId)referencesclass(cId))engine=innodb,charset=utf8;createtableclass......
  • springboot中优雅的个性定制化错误页面+源码解析
    boot项目的优点就是帮助我们简化了配置,并且为我们提供了一系列的扩展点供我们使用,其中不乏错误页面的个性化开发。理解错误响应流程我们来到org.springframework.boot.autoconfigure.web.servlet.error下的ErrorMvcAutoConfiguration这里面配置了错误响应的规则。主要介绍里面注册......