JAVA线程的中断

2023-11-16

每个线程都有一个boolean类型的标志来表明线程是否发生了中断,并且包含了中断相关的函数:interrupt()用于设置线程的中断状态为true,isInterrupted()用于返回线程的中断状态,interrupted()方法用于清除中断状态,并返回之前的中断状态。
当线程在调用sleep()或者wait()时,对中断的表现为抛出InterruptedException异常并清除中断状态,所以可以使用try-catch并在catch中写阻塞时被中断的处理方法:

/**
 *
 * @author jianbinggouzi
 */
public class MainClass{
    public static void main(String args[]){
        Object obj = new Object();
        
        Thread t2= new Thread(){
            public void run(){
               
                try{
               		 synchronized(obj){
						System.out.println("hello");
                		//obj.notify();
					}
                	
                }
                }catch(Exception e){
                    e.printStackTrace();
                }
               
            }
        };
        
        Thread t1 = new Thread(){
            
            public void run(){
                synchronized(obj){
             
                try {
                   
                    System.out.println("t1");
                    
                    obj.wait();
                    
                    System.out.println("finish");
                 
                }
                catch(InterruptedException e){
                   System.out.println("interrupted");
                    return;
                }
                catch (Exception ex) {
                    Logger.getLogger(MainClass.class.getName()).log(Level.SEVERE, null, ex);
                }
                }
               
            }
        };
        t1.start();
        t2.start();
        new Thread(){
            int n=0;
            public void run(){
                
                while(true){
                    try{
                         Thread.sleep(1000);
                         if(n++>1){
                             t1.interrupt();
                         }
                         System.out.println(t1.getState()+" "+t2.getState());
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                }
            }
        }.start( 
        
    }
}


结果:在这里插入图片描述

当线程没有处在阻塞状态时如果发生中断,线程将会保持运行下去直到运行到有对中断状态检查的地方(也就是说,由线程自己控制什么时候响应中断):

/**
 *
 * @author jianbinggouzi
 */
public class MainClass {
   
    public static void main(String args[]){
        
   
        
        Thread thread = new Thread(){
            public void run(){
                while(!Thread.currentThread().isInterrupted()){
                    System.out.println("running");
                }
                System.out.println("finish");
            }
        };
        thread.start();
        
        new Thread(){
            int n=0;
            public void run(){
                
                while(true){
                    try{
                         Thread.sleep(1000);
                         if(n++>1){
                             thread.interrupt();
                         }
                       
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                }
            }
        }.start();

    }
}

结果:
在这里插入图片描述
在线程池中,可以用submit(Runnable r)方法返回的Future实例来管理线程池中的线程,Future的cancel方法参数为true时,表示设置一个正在运行的线程的中断标记,为false时表示不设置线程的中断标记,适用于“如果线程还没启动,就取消这个线程,否则就不取消”:
当cancel(true)时:

/**
 *
 * @author jianbinggouzi
 */
public class ExecutorServiceTest {
    
    private ExecutorService service = Executors.newFixedThreadPool(10);
    
    private ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
    
   
    Future futures[] = new Future[2];
     
    public ExecutorServiceTest(){
        Runnable t = new Runnable(){
          public void run(){
              try{
                  System.out.println(Thread.currentThread().getId()+"start");
                  Thread.sleep(1000);
                  System.out.println(""+Thread.currentThread().getId()+"finish1");
              }catch(InterruptedException ex){
                  System.out.println(""+Thread.currentThread().getId()+"interrupted");
              }
              
              
          }  
        };
        for(int i=0;i<2;i++){
            futures[i] = threadPoolExecutor.submit(t);
        }

        try{
            Thread.sleep(200);
            System.out.println(futures[0].cancel(true)+" "+futures[1].cancel(true));
            
        
        }catch(Exception e){
            
        }
        
        
    }
    
}

输出:
在这里插入图片描述
cancel(false)时:

/**
 *
 * @author jianbinggouzi
 */
public class ExecutorServiceTest {
    
    private ExecutorService service = Executors.newFixedThreadPool(10);
    
    private ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
    
    Future futures[] = new Future[2];
     
    public ExecutorServiceTest(){
        Runnable t = new Runnable(){
          public void run(){
              try{
                  System.out.println(Thread.currentThread().getId()+"start");
                  Thread.sleep(1000);
                  System.out.println(""+Thread.currentThread().getId()+"finish1");
              }catch(InterruptedException ex){
                  System.out.println(""+Thread.currentThread().getId()+"interrupted");
              }
              
              
          }  
        };
        for(int i=0;i<2;i++){
            futures[i] = threadPoolExecutor.submit(t);
        }

        try{
            Thread.sleep(200);
            System.out.println(futures[0].cancel(false)+" "+futures[1].cancel(false));
            
        
        }catch(Exception e){
            
        }
        
        
    }
    
}

输出:在这里插入图片描述

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

JAVA线程的中断 的相关文章

  • Java 中的 XPath 节点集

    我在 eclipse 中有这段代码 NodeSet nodes NodeSet xPath evaluate expression inputSource XPathConstants NODESET 它给我 NodeSet 上的编译时错误
  • 我需要在 Spring 中检查每个控制器中的有效会话吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设在 Spring Mvc 的 Web 应用程序中 我们是否需要检查每个控制器或 jsps 中的有效会话 我该如何解决 MVC 中的
  • 如何测试 JUnit 测试的 Comparator?

    我需要测试 Compare 方法 但我对如何测试感到困惑 我可以看看该怎么做吗 public class MemberComparator implements Comparator
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • IntelliJ IDEA 创建的 JAR 文件无法运行

    我在 IntelliJ 中编写了一个跨越几个类的程序 当我在 IDE 中测试它时它运行良好 但是 每当我按照教程将项目制作成 jar 可执行文件时 它就不会运行 双击 out 文件夹中的文件时 该文件不会运行 并显示 无法启动 Java J
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • 使用替换字符串中多个单词的最有效方法[重复]

    这个问题在这里已经有答案了 此刻我正在做 Example line replaceAll replaceAll cat dog replaceAll football rugby 我觉得那很丑 不确定有更好的方法吗 也许循环遍历哈希图 ED
  • Clip 在 Java 中播放 WAV 文件时出现严重延迟

    我编写了一段代码来读取 WAV 文件 大小约为 80 mb 并播放该文件 问题是声音播放效果很差 极度滞后 你能告诉我有什么问题吗 这是我的代码 我称之为doPlayJframe 构造函数内的函数 private void doPlay f
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐

  • VMware16 安装windows_10

    一 镜像下载 1 Windows 镜像文件 cn windows 10 multiple editions version 1703 updated march 2017 x64 dvd 10194190 iso下载 迅雷下载 ed2k f
  • citespace使用教程系列文章:二、关键词聚类图

    关键词聚类图 上一章citespace安装和关键词共现图已经讲了软件安装和关键词共现 本文我们讲一下怎么做关键词聚类分析 1 接着上一篇文章继续以下操作 点击下图圈中的图标 进行关键词聚类 2 点击之后 将得到下图的结果 可以看见以 号开头
  • python3 with.py

    模块 python3 with py 参考 https docs python org zh cn 3 reference compound stmts html with https docs python org zh cn 3 ref
  • 关于海量用户访问的通用技术架构的一些思考

    最近12306 cn网站事件引起了很多人对架构的思考 这种访问量巨大的网站究竟该如何来做架构 下面是我的想法 因为要考虑到通用抛开业务单纯从技术层面分析 要承载海量用户的访问 要求网站高性能和高可用 安全可靠 高可收缩性 易于维护 等等一堆
  • 20道常见的kafka面试题以及答案

    JAVA面试宝典 搞定JAVA面试 不再是难题 系列文章传送地址 请点击本链接 目录 1 kafka的消费者是pull 拉 还是push 推 模式 这种模式有什么好处 2 kafka维护消息状态的跟踪方法 3 zookeeper对于kafk
  • jq微信账号正则表达式

    微信号官方规则 必须以字母或下划线开头 可以使用6 20位数字 字母 下划线 减号或它们的组合 正则表达式 a zA Z a zA Z0 9 6 20 如有其它问题欢迎大家留言
  • excel批量提取多个文件单元格_EXCEL高手专用函数Indirect,快速提取多个工作表,特定单元格数据...

    Indirect间接引用函数 你应学会的跨表引用技能 点关注 交朋友 大家共同学技术 几天前 看到有人问 excel中有哪些技能是你以前不知道 但是后来知道了却一直没有忘记的 我首先想到了 Indirect函数 使我的工作效率提高了百倍 千
  • vue常用知识总结

    vue常用知识总结 vue简介 vue 响应式原理 Object defineProperty vue 的作者 尤雨溪 java 出身 vue 是什么 以数据驱动视图的单页面 spa 渐进式 MVVM 框架 特性 数据双向绑定 模块化开发
  • Embarcadero Dev-C++第一次使用注意事项

    Embarcadero Dev C 第一次使用注意事项 Embarcadero Dev C 简介 2000年左右 Bloodshed software开发了Dev C 提供轻量 免费 开源的C C IDE Dev C 是最适合初学C 语言的
  • 基于stm32单片机自动灭火火灾报警装置Proteus仿真

    资料编号 102 下面是相关功能视频演示 102 基于stm32单片机自动灭火火灾报警装置Proteus仿真 仿真 源码 全套资料 功能介绍 火焰传感器的原理 是通过感知外部特殊波段光照强度的突变来判断是否出现火灾 该仿真采用ADC采集光照
  • Maven 知识点总结

    文章目录 Maven 1 Maven 坐标 2 Maven 仓库 3 Maven 依赖 依赖配置 依赖范围 依赖调解原则 排除依赖 4 Maven 生命周期 5 Maven 聚合与继承 Maven Maven是一个项目管理工具 它包含了项目
  • c# MACD 算法实现

    此算法在自己WP7应用中 用到 同花顺 算法 DIFF EMA CLOSE SHORT EMA CLOSE LONG DEA EMA DIFF M MACD 2 DIFF DEA Zero 0 关键点是第一天的数据 如果是区间的数据 区间第
  • Bootstrap弹出模态框

    弹出模态框 Modal 使用Bootstrap的JavaScript模态框插件可以为您的网站添加醒目的提示和交互 用于通知用户 访客交互 消息警示或自定义的内容交互 如考试问答场景 译者注 运行原理 在开始使用Bootstrap模态框组件前
  • CMDB功能分析与实现方案

    CMDB功能分析与实现方案 CMDB系统的主要功能 1 用户管理 记录测试 开发 运维人员的用户表 2 业务线管理 记录业务的详情 3 项目管理 指定此项目属于那一条业务线 4 应用管理 指定此应用的开发人员 5 主机管理 记录主机管理员
  • 软件项目管理和实施方案

    一 实施周期 自合同签订或约定之日起xxx个日历日内完成项目需求调研 软件开发及调试工作 实现系统上线运行 并完成项目验收 二 项目进度 一 项目计划 根据本公司对项目建设工期的整体计划 本公司将整个系统的建设工作按照计划进行详细分工 把任
  • PCL-OpenCV冲突的解决方案

    测试LIO SAM 编译期报错 error field param k has incomplete type flann SearchParams 查了github 把 usr include pcl 1 7 pcl kdtree kdt
  • Dialog的弹出位置控制

    Dialog一般出现都是屏幕中心 但有的时候我们希望它能在屏幕左侧 或者右侧亦或者是屏幕顶部 这时候我们就需要用的Dialog getWindow getAttributes 方法啦 dialog new Dialog getActivit
  • Qwt使用总结,初步整理

    最近研究了一些Qwt 至此总结Qwt的认识以便以后的备忘 从什么方面开始说起呢 从这个类是什么 可以用来做什么 关于Qwt的简介就不说了 主要说说其中用到的几个类吧 QwtPlot 是一个2D画图控件 Widget 继承于QFram和Qwt
  • Mybatis Plus 3.1.0枚举类处理器重写TypeHandler

    我的环境 Springboot 2 13 Mybatis Plus 3 1 Oracle 11g 驱动版本oracle6 1 我尝试用 Mybatis Plus 3 1 以上版本 如 3 2 3 3 时 oracle6 驱动无法适配 2 枚
  • JAVA线程的中断

    每个线程都有一个boolean类型的标志来表明线程是否发生了中断 并且包含了中断相关的函数 interrupt 用于设置线程的中断状态为true isInterrupted 用于返回线程的中断状态 interrupted 方法用于清除中断状