1. interrupt知识点

以下总结基于JDK8

本文不会完整说明interrupt,只会罗列一些比较重要的点。完整了解Thread.interrupt可以看参考资料。

以下的一些理解新的有助于理解参考资料的文章:

interrupt方法调用后,针对BLOCKED状态的线程,只是设定中断标志位为true。是否响应中断(感知这个标志位的变化)取决于API的设计。JDK的阻塞IO API、Synchronized同步块、还有Lock中的很多方法(不包括lockInterruptibly)都是不响应中断的。当然调用线程可以利用标志位判断来使得自己设计的API是可响应中断的。

interrupt方法调用后,针对WAITING/TIMED_WAITING状态的线程,会上抛interruptedException**并且设置中断标志位false**。例如线程调用Thread.sleep,Object.wait()之后。

如果线程尚未启动(NEW),或者已经结束(TERMINATED),则调用interrupt()对它没有任何效果,中断标志位也不会被设置。

最佳实践:有时候一些方法设计上不允许被中断或者取消,但是当别的线程发来中断请求的时候,也需要进行标记的保留,方便其他调用方“了解情况”

public Task getNextTask(BlockingQueue queue) {

boolean interrupted = false;

try {

while (true) {

try {

return queue.take();

} catch (InterruptedException e) {

//fianlly中依赖的状态标记

interrupted = true;

// fall through and retry

}

}

} finally {

if (interrupted)

//在fianlly中重新标记,确保没有丢失中断通知

Thread.currentThread().interrupt();

}

}

利用中断可以实现一些cancel的操作。例如:

package concurrent;

import java.util.concurrent.BlockingQueue;

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* Created by wanshao

* Date: 2017/12/18

* Time: 下午3:42

**/

public class InterruptExample {

public static void main(String[] args) throws InterruptedException {

InterruptTask interruptTask = new InterruptTask();

ExecutorService executorService = Executors.newSingleThreadExecutor();

executorService.submit(interruptTask);

Thread.sleep(100);

interruptTask.cancel();

executorService.shutdown();

}

}

/**

* 一个响应中断的任务

*/

class InterruptTask implements Callable {

private BlockingQueue queue;

//保存要被interrupt的线程

Thread t;

@Override

public Integer call() throws InterruptedException {

System.out.println("start a blocked task");

try {

t = Thread.currentThread();

Thread.currentThread().sleep(50000);

} catch (InterruptedException e) {

System.out.println("be interrupted");

e.printStackTrace();

}

return 0;

}

public void cancel() {

System.out.println("cacel a task....");

//这里直接调用Thread.currentThread()会获取到main线程,而不是线程池里面的线程

if (!t.isInterrupted()) {

t.interrupt();

}

}

}

总结

以上所述是小编给大家介绍的基于JDK8总结java中的interrupt,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

interupt java_基于JDK8总结java中的interrupt相关推荐

  1. opencv 裁剪 java_如何在opencv java中裁剪检测到的面部图像

    我在 java中使用opencv 2.4.10检测到图像中的面部 我把我的面部检测代码. import org.opencv.core.Core; import org.opencv.core.Mat ...

  2. php中继承过来的类初始化顺序,java_图文详解Java中class的初始化顺序,class的装载 在讲class的初始化 - phpStudy...

    图文详解Java中class的初始化顺序 class的装载 在讲class的初始化之前,我们来讲解下class的装载顺序. 以下摘自<Thinking in Java 4> 由于Java ...

  3. unformat方法java_快速入门介绍Java中强大的String.format()

    快速入门介绍Java中强大的String.format() 发布于 2020-12-12| 复制链接 摘记: 前言从 Java 5.0 开始,String 类新增了一个强大的字符串格式化方法 form ...

  4. interrupt java_关于java中的interrupt

    一.概念 java中线程有开始,运行(就绪,运行),阻塞,等待,终止这几种状态.其中在等待的时候可以通过设置中断标志位来唤醒线程.一般情况下等待状态的线程检查到中断标志被置位,则会抛出Interrup ...

  5. JWT的基于JJWT在Java中使用

    1.什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式 ...

  6. mockito java_使用Mockito在Java中进行模拟入门

    mockito java 我们都编写了单元测试,但是有时我们面临的挑战是被测单元可能依赖于其他组件. 并且配置其他组件进行单元测试绝对是一个过大的选择. 相反,我们可以使用Mocks代替其他组件,并继 ...

  7. 出租车系统java_基于WEB的JAVA出租车打车系统

    每天记录学习,每天会有好心情.*^_^* 今天记录的项目是出租车打车系统,这个项目是这么回事:为了适应新型出租车管理体制,设计了一个基于Web平台的出租车管理系统方案.介绍了该系统的总体框架,除常见功 ...

  8. mail java_基于JavaMail的Java邮件发送:简单邮件发送

    http://blog.csdn.net/xietansheng/article/details/51673073 http://www.cnblogs.com/codeplus/archive/20 ...

  9. cucumber java_如何在Cucumber Java中的步骤之间传递变量值?

    在Cucumber for Java(cucumber-jvm)中,在步骤之间共享数据的预期方式是使用依赖性集成(DI)容器 – 其中一些已与Cucumber集成. 使用DI的方法在容器之间略有不同, ...

最新文章

  1. Jasperreport导出pdf内容展示不完全处理
  2. 通过工具SecureCRTPortable将项目部署到服务器上
  3. idea集成scala插件
  4. 74cms3.0安装以及cmsSQL注入漏洞详解
  5. 使用AxiosJavaScript中的简单HTTP请求
  6. ICQ被购后看腾讯出击DST:迈出国际化的关键一步
  7. 10年前腾讯微信后台第一天提交的代码曝光;苹果App Store佣金抽成再做让步;TypeScript 4.1发布|极客头条...
  8. python画条形图-用Matplotlib如何绘制条形图、直方图和散点图
  9. 基于yolo3 与crnn 实现中文自然场景文字检测及识别
  10. 艺术范,技术芯——读达芬奇有感
  11. 【转载】 Sqlserver使用Left函数从最左边开始截取固定长度字符串
  12. css-富文本编辑显示
  13. html5indexeddb排序,html5的indexedDB数据库操作实例
  14. 中国工程院院士评选结果公布,阿里王坚当选
  15. vue 给圆遮盖物添加文字 高德地图_【高德地图开发4】---增加覆盖物setMapTextZIndex...
  16. 如何做好检测报告的质量控制?-LIMS2
  17. 栈+模拟(大鱼吃小鱼)
  18. Javaweb企业员工信息管理系统
  19. 网络安全与网站安全及计算机安全:如何使用Kali Linux进行MS08-067安全演练
  20. 统计虚词使用不同聚类方法判别红楼梦作者

热门文章

  1. 怎么设置动态壁纸?这样做就行!
  2. 看门狗定时周期设置的秘密
  3. Python爬虫爬取智联招聘!谁说Python岗位少的?
  4. Elasticsearch集群部署及Head插件安装
  5. uni.showModal 里的this指向
  6. 2022 年 5 月产品大事记
  7. Java微服务架构有哪些功能?
  8. windows下安装cython-bbox失败
  9. 计算机视觉:两个旋转检测框bbox的IoU计算
  10. 2021年上海市人口分布数据