通过关闭线程底层资源关闭类似synchronized及IO阻塞的情况
public class IoBlocked implements Runnable { private InputStream in; public IoBlocked(InputStream in) {
this.in = in;
} @Override
public void run() {
// TODO Auto-generated method stub try {
print("Wait for read()");
int value=in.read();
// print("in.read():"+value);
} catch (IOException e) {
// TODO Auto-generated catch block
if (Thread.currentThread().isInterrupted()) {
print("interrupted from block IO ");
} else {
throw new RuntimeException(e);
}
} }
}
public class CloseResource { /**
* 1.ExecutorService.shutdownNow(): 通过Thread.interrupt()试图停止所有正在执行的线程,并不再处理还在队列中等待的任务<br>
* 2.ExecutorService.shutdown(): 不允许提交新任务,等待当前任务及队列中的任务全部执行完毕后退出
* 3.当关闭阻塞的线程时会抛出异常:注意
* @param args
* @throws IOException
* @throws InterruptedException
*/
public static void main(String[] args) throws IOException, InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
ServerSocket socket = new ServerSocket(8080);// 建立一个监控8080端口的服务器...
InputStream socketInput = new Socket("localhost", 8080).getInputStream(); executorService.execute(new IoBlocked(socketInput));
executorService.execute(new IoBlocked(System.in));
TimeUnit.MILLISECONDS.sleep(100);
print("Shutting down all Resources");
executorService.shutdownNow();
TimeUnit.SECONDS.sleep(1);
print("Closeing:" + socketInput.getClass().getName());
socketInput.close();
TimeUnit.SECONDS.sleep(1); print("Closeing:" + System.in.getClass().getName());
System.in.close(); } }
output:
p.p1 { margin: 0; font: 11px Monaco }
Wait for read()
Wait for read()
Shutting down all Resources
Closeing:java.net.SocketInputStream
interrupted from block IO
Closeing:java.io.BufferedInputStream
说明两点
1.关闭Executor启动的单个线程可以通过submit获取Future对象然后调用cancel方式来中断某个特定的任务!但对于像sync,IO阻塞无效
2.有趣点:
executorService.shutdownNow()视乎发生在关闭socket的那个时刻;但没任何证据;只是通过输出而已
通过关闭线程底层资源关闭类似synchronized及IO阻塞的情况的更多相关文章
- Java关闭线程的安全方法
Java之前有一个api方法可以直接关闭线程,stop(),由于这个方法是强制性地关闭线程,有的时候会发生错误,之后就取消了,现在可用的方法主要有两种: 1. 在线程中加入一个成员变量,当一个fla ...
- Java线程状态和关闭线程的正确姿势
1.线程状态及切换 Java中的线程有六种状态,使用线程Thread内的枚举类来实现,如下,我对每个状态都进行了一定的解释. public enum State { /** 表示一个线程还没启用(即未 ...
- inux下C中怎么让才干安全关闭线程
前言: 多线程程序中,特别是频繁申请.释放线程的情况下,就要注意线程的关闭,最好使用线程池. 一,线程退出方式 (1) 运行完毕后隐式退出: (2) 由线程本身显示调用pthr ...
- linux环境中关闭tomcat,通过shutdown.sh无法彻底关闭--线程池
最近测试环境上测试的项目通过shutdown.sh始终无法彻底关闭. 之前临时解决方法两种: 第一:通过ps -ef|grep tomcat查看到tomcat的进程直接使用kill来杀死进程. 第二: ...
- Liferay 6.2 改造系列之十一:默认关闭CDN动态资源
在行业客户中,一般无法提供CDN服务,因此默认关闭CDN动态资源功能: 在/portal-master/portal-impl/src/portal.properties文件中,有如下配置: # # ...
- 在线程池使用Callable和Runnable的区别以及如何关闭线程
一.区别总结: Callable定义的方法是call,而Runnable定义的方法是run. Callable的call方法可以有返回值,而Runnable的run方法不能有返回值,这是核心区别. C ...
- Java多线程之通过标识关闭线程
package org.study2.javabase.ThreadsDemo.status; /** * @Auther:GongXingRui * @Date:2018/9/19 * @Descr ...
- juc线程池原理(三):ThreadFactory、拒绝策略、提交任务、关闭线程池
概要 (一) ThreadFactory 线程池中的ThreadFactory是一个线程工厂,线程池创建线程都是通过线程工厂对象(threadFactory)来完成的. 类图如下: 上面所说的thre ...
- golang defer使用——资源关闭时候多用
defer Go语言中有种不错的设计,即延迟(defer)语句,你可以在函数中添加多个defer语句.当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回.特别是当你在进行一些打开资源 ...
随机推荐
- 基于java实现的简单网页日历功能,有兴趣得可以把它转换到前端实现
之前做项目的时候,因为要用到不同日期显示不同的内容,就自己做了一个日期的显示和选择功能,今天抽空把以前的代码理了一下,顺便就把之前做的日期功能给拿出来回顾一下,大家可以提点意见,帮忙完善下设计.先上一 ...
- 整理一下《java并发编程实战》中的知识点
分工.同步.互斥的历史由来 分工:单道.多道.分时 同步:线程通信(组织编排任务) 互斥:因(多线程访问共享资源)果(串行化共享资源的访问) 1切都是为了提高性能 2.可见性.原子性.有序性 可见性: ...
- moviepy音视频开发:audio_loop实现音频内容循环重复
☞ ░ 前往老猿Python博文目录 ░ 概述 moviepy的audio_loop函数用于将音频剪辑内容循环一定次数,返回值是原剪辑内容重复指定次数对应的剪辑. 调用语法: audio_loop(a ...
- moviepy音视频剪辑:视频半自动追踪人脸打马赛克
一.引言 在<moviepy1.03音视频剪辑:使用manual_tracking和headblur实现追踪人脸打马赛克>介绍了使用手动跟踪跟踪人脸移动轨迹和使用headblur对人脸进行 ...
- PyQt(Python+Qt)学习随笔:QTreeWidgetItem项的子项索引、删除子项的方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 树型部件QTreeWidget中的QTreeWidgetItem项: 获取子项索引 可通过index ...
- PyQt(Python+Qt)学习随笔:QListWidgetItem的构造方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QListWidgetItem对象专门用于作为QListWidget对象的一个项. QListWid ...
- 第14.11节 Python中使用BeautifulSoup解析http报文:使用查找方法快速定位内容
一. 引言 在<第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问>介绍了BeautifulSoup对象的主要属性,通过这些属性可以访 ...
- Python中高级知识(非专题部分)学习随笔
Python学习随笔:使用xlwings读取和操作Execl文件 Python学习随笔:使用xlwings新建Execl文件和sheet的方法 博客地址:https://blog.csdn.net/L ...
- centos 6.4-linux环境配置,安装hadoop-1.1.2(hadoop伪分布环境配置)
1 Hadoop环境搭建 hadoop 的6个核心配置文件的作用: core-site.xml:核心配置文件,主要定义了我们文件访问的格式hdfs://. hadoop-env.sh:主要配置我们的j ...
- espcms代码审计(二次urldecode注入分析)
这里提到的漏洞是二次urldecode注入 这里用到的还是espcms,不过版本应该跟之前的有所不同,在网上找到的espcms源代码都是已经修补了这个漏洞的,我们对比分析吧 先放上漏洞位置代码,也就是 ...