【java并发编程实战】第七章:取消与关闭
停止线程的几种方式
一般的逻辑停止
public class ThreadInterruptTest {
public static volatile boolean cancel = true;
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(
new Runnable() {
@Override
public void run() {
while (cancel) {
System.out.println("still alive");
}
}
}
);
thread.start();
Thread.sleep(1000L);
cancel = false;
}
}
注意:上面的代码如果在线程的运行逻辑中有调用阻塞的方法,比如arrayBlockQueue的put操作,就会一直等待插入,直到队列有空位位置。就会导致cancel的判断永远不会执行。所以可以采用中断的方式
中断
采用interrupt()。对线程设置为中断标志。设置后不会立刻终端线程,而是待调用严格检查异常interruptException的时候就会停止,比如await,sleep等。
通常,interrupt是中断线程的最佳方式
通过future来取消
Future.cancle(boolean), true:任务正在当前线程执行,可以终端。false:如果任务还未执行,就不要运行。
注意:在调用了cancel方法后,再调用isDone将永远返回true
对于处理不可中断的阻塞
对于不能响应中断interruptException的阻塞。interrupt方法只能标志位可中断,但是无任何其他的作用。对于这些阻塞的中断 ,我们应该查找阻塞的原因,然后重写interrupt的方法来中断。
- 1.java.io的socket io操作:常见的阻塞在于套接字的读取和写入。虽然inputstream和outputstream不会响应中断,但是可以通过关闭底层套接字的方式。是的read和write抛出socketexception。
- 2.java同步io
- 3.java异步io
- 4.显示锁的Lock.lockinterruptibly.
// 待续
【java并发编程实战】第七章:取消与关闭的更多相关文章
- Java并发编程实战---第六章:任务执行
废话开篇 今天开始学习Java并发编程实战,很多大牛都推荐,所以为了能在并发编程的道路上留下点书本上的知识,所以也就有了这篇博文.今天主要学习的是任务执行章节,主要讲了任务执行定义.Executor. ...
- Java并发编程实战 第16章 Java内存模型
什么是内存模型 JMM(Java内存模型)规定了JVM必须遵循一组最小保证,这组保证规定了对变量的写入操作在何时将对其他线程可见. JMM为程序中所有的操作定义了一个偏序关系,称为Happens-Be ...
- Java并发编程实战 第8章 线程池的使用
合理的控制线程池的大小: 下面内容来自网络.不过跟作者说的一致.不想自己敲了.留个记录. 要想合理的配置线程池的大小,首先得分析任务的特性,可以从以下几个角度分析: 任务的性质:CPU密集型任务.IO ...
- 【java并发编程实战】第一章笔记
1.线程安全的定义 当多个线程访问某个类时,不管允许环境采用何种调度方式或者这些线程如何交替执行,这个类都能表现出正确的行为 如果一个类既不包含任何域,也不包含任何对其他类中域的引用.则它一定是无状态 ...
- java并发编程实战《七》安全性、活跃性以及性能问题
安全性.活跃性以及性能问题 安全性问题 那什么是线程安全呢?其实本质上就是正确性,而正确性的含义就是程序按照我们期望的执行,不要让我们感到意外. 存在共享数据并且该数据会发生变化,通俗地讲就是有多个线 ...
- Java并发编程实战 第6章 任务并行 第7章 取消与关闭
ExecutorCompletionService CompletionService用来接收一个Executor的执行结果,将已经完成任务,放置在可使用 take 访问的队列上. 大概用法: Exe ...
- JAVA并发编程实战---第三章:对象的共享(2)
线程封闭 如果仅仅在单线程内访问数据,就不需要同步,这种技术被称为线程封闭,它是实现线程安全性的最简单的方式之一.当某个对象封闭在一个线程中时,这种方法将自动实现线程安全性,即使被封闭的对象本生不是线 ...
- 《Java并发编程实战》第九章 图形用户界面应用程序界面 读书笔记
一.为什么GUI是单线程化 传统的GUI应用程序通常都是单线程的. 1. 在代码的各个位置都须要调用poll方法来获得输入事件(这样的方式将给代码带来极大的混乱) 2. 通过一个"主事件循环 ...
- java并发编程实战:第二章----线程安全性
一个对象是否需要是线程安全的取决于它是否被多个线程访问. 当多个线程访问同一个可变状态量时如果没有使用正确的同步规则,就有可能出错.解决办法: 不在线程之间共享该变量 将状态变量修改为不可变的 在访问 ...
- Java并发编程实战 第15章 原子变量和非阻塞同步机制
非阻塞的同步机制 简单的说,那就是又要实现同步,又不使用锁. 与基于锁的方案相比,非阻塞算法的实现要麻烦的多,但是它的可伸缩性和活跃性上拥有巨大的优势. 实现非阻塞算法的常见方法就是使用volatil ...
随机推荐
- python 实现远程上传文件夹
python2 upload.py "ip" "root" "password" "22" "Only Pro ...
- css的基础用法(下)
定位: <html> <head> <meta charset="utf-8" /> <title>定位</title> ...
- Aaliyun Linux 64 安装jdk+mysql+tomcat
参考: http://www.blogjava.net/amigoxie/archive/2013/02/22/395605.html http://bbs.aliyun.com/read/17704 ...
- DLL DEF文件编写方法 VC++ 调用、调试DLL的方法 显式(静态)调用、隐式(动态)调用
DLL 文件编写方法: 1.建立DLL工程 2.声明.定义要导出的函数 BOOL WINAPI InitDlg( HWND hTabctrl,TShareMem* pTshare,CRect* prc ...
- npm cnpm npx nvm 傻傻分不清
用过 npm cnpm吗?知道 npx nvm 吗? 唔~ npm npm 的全称是 Node Package Manager 是 JavaScript 世界的包管理工具,并且是 Node.js 平台 ...
- MySQL建表
-- 1.创建部门表dept 1 CREATE TABLE dept( 2 deptno INT PRIMARY KEY, 3 dname VARCHAR(20) UNIQUE NOT NULL, 4 ...
- Nodejs 使用 addons 调用c++ 初体验(一)
纠结很久,决定写一点遇到的“坑”. 基础环境:win7-64bit node(v7.5.0) 这些安装实在是太方便了,自行准备吧. 1. 安装 python(2.7.x ),用npm安装 nod ...
- ruby编码说明
程序编码一般分几种情况: 1.源码文件编码 2.接收外部内容的编码 3.运行环境编码 4.操作系统编码 首先源码文件的编码,可以通过在ruby文件的头部添加一行申明即可,这样所有在源码里面出现的字符都 ...
- (杭电 1097)A hard puzzle
A hard puzzle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- 按升序打印X,Y,Z的整数值
#include <stdio.h> #define TRUE 1 #define FALSE 0 int main() { int x,y,z; printf("x: &quo ...