基于JDK8总结java中的interrupt
作者:Blog of Kami Wan 发布时间:2021-12-27 07:43:54
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<Task> 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<Integer> {
private BlockingQueue<Task> 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网站的支持!
来源:http://www.kaimingwan.com/post/java/javabing-fa-yu-suo/guan-yu-javazhong-de-interrupt?utm_source=tuicool&utm_medium=referral


猜你喜欢
- 这篇文章主要介绍了java文件下载代码实例(单文件下载和多文件打包下载),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- Docker 存储驱动详细介绍最近做项目,期间对Docker 存储驱动不会,于是在网上找资料,并解决了,这里就记录下。目的理解docker的
- 一、实战-内存溢出堆内存溢出栈内存溢出方法区溢出直接内存溢出二、实战-堆内存溢出演示堆内存溢出代码,并且定位问题总结堆内存溢出的场景与解决方
- Java 回调函数概要: 所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个
- C#编写winform程序时,用到的,格式强转,存储到数据库,数据库连接那块就不写了希望对大家有帮助,欢迎评论互相分享技术!//日期格式强制
- 在Android TV上一般选中某个View, 都会有焦点突出放大的效果, 但是当在RecyclerView中(ListView或GridV
- 这篇文章主要介绍了Java模拟多线程实现抢票,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考
- 一般来讲,项目更换JDK版本的情况比较少,但是有时难免会遇到。电脑安装不同版本的JDK这里不做介绍。这里记录一下修改项目JDK版本要注意的几
- 1.首先解释一下什么是方法重载?方法重载是指在同一个类中方法同名,参数不同,调用时根据实参的形式,选择与他匹配的方法执行操作的一种技术。这里
- HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实
- 前言:回顾之前的微信公众号配置和消息处理的内容,我们已经掌握了如何配置服务器与微信公众号建立连接,也掌握了通过消息管理的方式,对用户的信息进
- 这是个很简单的问题,但每次隔一段时间后使用起来总是会出点乱子。这里记录下Logcat的步骤:1,在Activity里申明tag变量(名字其实
- 废话不多说了,直接给大家上代码了,具体代码如下所示:代码如下:using System;using System.Collections.G
- Java 中的引用类型:强引用、软引用、弱引用和虚引用强引用如 Object object = new Object(),那 object
- 1、比较器①比较器的引入a.首先,当我们单一地比较某一种数据类型的数组时,可以直接用Arrays.sort()进行实现b.而当我们同时含有多
- Java BorderLayout布局管理器的两种排列java中Frame类默认的布局管理器为BorderLayout,其主要是将Frame
- tk.mybatis扩展自己的通用mapper目的:tk.mybatis 提供的通用mapper,虽然使用方便,不过在有些sql还是不能满足
- jwt简介冒泡排序:(Bubble Sort)是一种简单的交换排序。之所以叫做冒泡排序,因为我们可以把每个元素当成一个小气泡,根据气泡大小,
- C#移除字符串中的不可见Unicode字符 背景最近发现某个数据采集的系统拿下来的数据,有些字段的JSON被莫名截断了,导致后续数
- 本文实例为大家分享了java实现购物车功能的具体代码,供大家参考,具体内容如下1 需要实现1、实现淘淘商城的购物车功能2 购物车功能2.1