我们知道很多类库中的阻塞方法在抛出InterruptedException后会清除线程的中断状态(例如 sleep、 阻塞队列的take),但是今天却发现了一个特别奇怪的现象,先给出代码:

    public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() {
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
System.out.println("first interrupted!!!");
} System.out.println(Thread.currentThread().isInterrupted()); try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.println("second interrupted!!!");
}
}
}); executor.shutdownNow();
}

如果按照我的理解,调用shutdownNow后会给线程池中的工作者线程发出中断请求,并在第一个睡眠的地方抛出 InterruptedException ,但是在抛出异常后这种中断状态就应该被清除了,所以第二次睡眠不应该失败,但是结果却是失败的,本来以为是系统的原因,可是在linux下测试也是如此。

更令人不解的是如果我把第二次睡眠换成其他的阻塞方法(queue.take)那么就不会抛出异常,而是正常阻塞。

    public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
final BlockingQueue<String> queue = new LinkedBlockingQueue<>();
executor.execute(new Runnable() {
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
System.out.println("first interrupted!!!");
} System.out.println(Thread.currentThread().isInterrupted()); try {
queue.take();
} catch (InterruptedException e) {
System.out.println("second interrupted!!!");
}
}
}); executor.shutdownNow();
}

还有更让人受不了的,如果我们在任务最开始随便写点什么,就会按照我们期待的执行了(心中一万只草泥马呀)

    public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() {
@Override
public void run() {
System.out.println("xxxx");
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
System.out.println("first interrupted!!!");
} System.out.println(Thread.currentThread().isInterrupted()); try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
System.out.println("second interrupted!!!");
}
}
}); executor.shutdownNow();
}

以后有机会再研究吧,可能还是知识不够吧!!!!

一个关于ExecutorService shutdownNow时很奇怪的现象的更多相关文章

  1. route 一个很奇怪的现象:我的主机能ping通同一网段的其它主机,并也能xshell 远程其它的主机,而其它的主机不能ping通我的ip,也不能远程我和主机

    一个很奇怪的现象:我的主机能ping通同一网段的其它主机,并也能xshell 远程其它的主机,而其它的主机不能ping通我的ip,也不能远程我和主机. [root@NB Desktop]# route ...

  2. overflow-x和overflow-y其中一个设置为visible时的奇怪现象

    当overflow-x和overflow-y其中一个设置为visible时,如果另一个不是visible,那么它会被自动重置为auto 看看效果先: 第一次遇到这个问题时,我还以为是chrome的一个 ...

  3. Java错误:很奇怪的错误。。。

    刚刚调试java web中出现了一个很奇怪的现象,前端有一个页面通过ajax调用后台的servlet,当我把后台的servlet代码修改后(将返回值由a修改为b),前端页面仍然获取的是a.调试跟踪se ...

  4. PhoneGap奇怪的现象:File FileTransfer download, 手机相册检测不到下载下来的图片(解决)

    我有个从服务器下载相片的功能在使用 File FileTransfer download api时,碰到了很奇怪的现象:图片已经从服务器里下载了,手机文件夹里也可以看到下载过来的图片,但是我的手机相册 ...

  5. 遇到一个git branch很奇怪的问题

    最近,同事做了一个自动化的打包平台,但我发现里面的分支竟然有重复的,还有一些已经删除的branch. 比如,我已经删除了一个 test分支,在工程 game 目录下(已输入 git pull),输入: ...

  6. 一个很奇怪的重复链接lib的问题

    早上在调一个程序的时候感觉非常奇怪,就是数据在初始化的时候会失败,后来发现是获取一个数据的时候出错了 假设我们又一个config.lib,sql.dll和main.exe 因为数据库在打开数据库的时候 ...

  7. css pre如果同时运用了css的border-radius、 overflow两个属性且标签中内容太多时,外部div滚动条在firefox下滚动时很卡

    pre如果同时运用了css的border-radius. overflow两个属性且标签中内容太多时,外部div滚动条在firefox下滚动时很卡. 解决方法:去掉css中border-radius. ...

  8. 浅谈如何写出一个让(坑)人(王)很(之)难(王)发现的bug

    该文章内容来自脚本之家,原文链接:https://www.jb51.net/news/598404.html 程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因 ...

  9. JS垃圾回收——和其他语言一样,JavaScript 的 GC 策略也无法避免一个问题:GC 时,停止响应其他操作,这是为了安全考虑

    JavaScript 内存管理 & 垃圾回收机制 标记清除 js 中最常用的垃圾回收方式就是标记清除.当变量进入环境时,例如,在函数中声明一个变量,就将这个而变量标记为“进入环境”.从逻辑上讲 ...

随机推荐

  1. 聊两句XSS(跨站脚本攻击)

    XSS(跨站脚本攻击),聊两句,五毛的. XSS的危害: 窃取Cookie,盗用用户身份信息 这玩意儿是大多数XSS的目标,也好解决,可以先治个标,直接设置HttpOnly=true ,即不允许客户端 ...

  2. Hello Python!用 Python 写一个抓取 CSDN 博客文章的简单爬虫

    网络上一提到 Python,总会有一些不知道是黑还是粉的人大喊着:Python 是世界上最好的语言.最近利用业余时间体验了下 Python 语言,并写了个爬虫爬取我 csdn 上关注的几个大神的博客, ...

  3. MongoDB用户权限操作语法及示例

    1.创建用户 1.1.语法格式: 1.1.1.格式及例子 >db.createUser( { user: "<name>", pwd: "<cle ...

  4. 推荐系统实践 0x13 Word2Vec

    Word2Vec是谷歌团队提出的,让词向量在自然语言处理当中再度流行,并且推广到了广告.搜索.推荐等各个领域当中.Word2Vec顾名思义,就是一个生成对词的向量表达的模型.假设我们使用一组句子组成的 ...

  5. 使用Modbus4J进行RTU模式串口通信

    Modus协议是由MODICON(现为施耐德电气公司的一个品牌)在1979年开发的,是全球第一个真正用于工业现场的总线协议,应用非常广泛,可谓大名鼎鼎. 理论性的东西就不多介绍了,推荐一本书<M ...

  6. Android中app开机自启动的开发

    (1)首先添加权限开机启动权限 <!--开机启动权限--> <uses-permission android:name="android.permission.RECEIV ...

  7. springcloud学习(一)之Eureka

    前言 微服务原则上是应该有多个服务提供者的实例的,在通常情况下服务提供者的数量和分布往往是动态变化的,这样在传统的单体应用中的那种硬编码服务url进行远程调用的方式就不足取.服务注册中心就是为了解决服 ...

  8. 第三章 IP地址规划设计技术(很重要)

    知识重点: 选择题考点 IP基础(网络地址.子网掩码) 网络地址转换 NAT 的原理 CIDR (计算方法) IPv6 地址表示 综合题 IP地址的分类与计算 VLSM 地址规划 3.1 基础知识 3 ...

  9. 10. C++对象模型和 this 指针

    1. 成员变量和成员函数分开存储 在C++中,类内的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上 空对象占用内存空间为:1 ----> C++编译器会给每个空对象也分配一个字节 ...

  10. sql操作数据库(3)-->外键约束、数据库表之间的关系、三大范式、多表查询、事务

    外键约束 在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名) 在已有表中添加外键约束:alter t ...