并发编程 07—— 任务取消
Java并发编程实践 目录
并发编程 01—— ThreadLocal
并发编程 02—— ConcurrentHashMap
并发编程 03—— 阻塞队列和生产者-消费者模式
并发编程 04—— 闭锁CountDownLatch 与 栅栏CyclicBarrier
并发编程 05—— Callable和Future
并发编程 06—— CompletionService : Executor 和 BlockingQueue
并发编程 07—— 任务取消
并发编程 08—— 任务取消 之 中断
并发编程 09—— 任务取消 之 停止基于线程的服务
并发编程 10—— 任务取消 之 关闭 ExecutorService
并发编程 11—— 任务取消 之 “毒丸”对象
并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
并发编程 13—— 线程池的使用 之 配置ThreadPoolExecutor 和 饱和策略
并发编程 14—— 线程池 之 整体架构
并发编程 15—— 线程池 之 原理一
并发编程 16—— 线程池 之 原理二
并发编程 17—— Lock
并发编程 18—— 使用内置条件队列实现简单的有界缓存
并发编程 19—— 显式的Conditon 对象
并发编程 20—— AbstractQueuedSynchronizer 深入分析
并发编程 21—— 原子变量和非阻塞同步机制
概述
第1部分 问题引入
第2部分 实例
参考
第1部分 问题引入
如果外部代码能在某个操作正常完成之前将其置入“完成”状态,那么这个操作就可以称为可取消的。
在java中没有一种安全的抢占式方式来停止线程,因此也就没有安全的抢占式方法来停止任务。只有一些协作式的机制,使请求取消的任务和代码都遵循一种协商好的协议。
其中一种协作机制能设置某个“已请求取消”标志,而任务将定期地查看该标志。如果设置了这个标志,那么任务将提前结束。
第2部分 实例
下面程序,其中PrimeGenerator 持续地枚举素数,直到它被取消。cancel方法将设置cancelled标志,并且主循环在搜索下一个素数之前会首先检查这个标志。(为了使这个过程能可靠地工作,标志cancelled必须为volatile类型)
1 package com.concurrency.CancellationAndShutdown_7; 2 3 import java.math.BigInteger; 4 import java.util.ArrayList; 5 import java.util.List; 6 7 import net.jcip.annotations.GuardedBy; 8 9 /** 10 * 使用volatile 类型的域来保存取消状态 11 * @ClassName: PrimeGenerator 12 * @author Xingle 13 * @date 2014-9-24 下午3:05:08 14 */ 15 public class PrimeGenerator implements Runnable{ 16 17 @GuardedBy("this") 18 private final List<BigInteger> primes = new ArrayList<BigInteger>(); 19 20 private volatile boolean cancelled; 21 22 @Override 23 public void run() { 24 BigInteger p = BigInteger.ONE; 25 while(!cancelled){ 26 //返回下一个大于p的素数 27 p = p.nextProbablePrime(); 28 synchronized (this) { 29 primes.add(p); 30 31 } 32 } 33 } 34 35 public void cancel(){ 36 cancelled = true; 37 } 38 39 public synchronized List<BigInteger> get(){ 40 return new ArrayList<BigInteger>(primes); 41 } 42 43 }
测试程序:
1 package com.concurrency.CancellationAndShutdown_7; 2 3 import java.math.BigInteger; 4 import java.util.List; 5 6 7 /** 8 * 测试程序—— 运行100ms时间的素数生成器 9 * @ClassName: PrimeGeneratorMain 10 * @author Xingle 11 * @date 2014-9-24 下午5:23:44 12 */ 13 public class PrimeGeneratorMain { 14 15 public static void main(String[] args){ 16 PrimeGenerator generator = new PrimeGenerator(); 17 new Thread(generator).start(); 18 try { 19 Thread.sleep(100); 20 } catch (InterruptedException e) { 21 e.printStackTrace(); 22 } finally { 23 generator.cancel(); 24 } 25 List<BigInteger> ls = generator.get(); 26 for(int i= 0;i<ls.size();i++){ 27 System.out.println(ls.get(i)); 28 } 29 } 30 }
执行结果:
参考:
1.《并发编程实战》
转载于:https://www.cnblogs.com/xingele0917/p/3993369.html
并发编程 07—— 任务取消相关推荐
- Java并发编程(07):Fork/Join框架机制详解
本文源码:GitHub·点这里 || GitEE·点这里 一.Fork/Join框架 Java提供Fork/Join框架用于并行执行任务,核心的思想就是将一个大任务切分成多个小任务,然后汇总每个小任务 ...
- 并发编程实战:取消和关闭
任务和线程的启动很容易.在大多数时候,我们都会让它们运行直到结束,或者让它们自行停止.然而,有时候我们希望提前结束任务或线程,或许是因为用户取消了操作,或者应用程序需要被快速关闭. 要使任务和线程能安 ...
- Java 并发编程之任务取消(五)
停止基于线程的服务 正确的封装原则是:除非拥有某个线程,否则不能对该线程进行操控.例如中断线程或修改线程的优先级等 .那么什么 是拥有某个线程呢,就是创建该线程的类,一般来说线程池是其工作线程的所有者 ...
- 实战并发编程 - 07循环等待死锁问题
文章目录 Pre 什么是死锁 死锁代码 死锁产生的原因 如何避免死锁 1. 破坏占用且等待条件 2. 破坏不可抢占条件 3.破坏循环等待条件 小结 Pre [账户A]转账给[账户B],同时[账户B]也 ...
- 【JUC并发编程07】Callable接口
文章目录 7 Callable接口 7.1 Callable接口创建线程 7.2 FutureTask 7 Callable接口 创建线程的多种方式: 继承Thread类 实现Runnable接口 C ...
- 并发编程-06线程安全性之可见性 (synchronized + volatile)
文章目录 线程安全性文章索引 脑图 可见性定义 导致不可见的原因 可见性 -synchronized (既保证原子性又保证可见性) 可见性 - volatile(但不保证操作的原子性) volatil ...
- 并发编程-05线程安全性之原子性【锁之synchronized】
文章目录 线程安全性文章索引 脑图 概述 原子性synchronized 修饰的4种对象 修饰代码块 作用范围及作用对象 Demo 多线程下 同一对象的调用 多线程下不同对象的调用 修饰方法 作用范围 ...
- 并发编程-04线程安全性之原子性Atomic包的4种类型详解
文章目录 线程安全性文章索引 脑图 概述 原子更新基本类型 Demo AtomicBoolean 场景举例 原子更新数组 Demo 原子更新引用类型 Demo 原子更新字段类型 使用注意事项: Dem ...
- 并发编程-03线程安全性之原子性(Atomic包)及原理分析
文章目录 线程安全性文章索引 脑图 线程安全性的定义 线程安全性的体现 原子性 使用AtomicInteger改造线程不安全的变量 incrementAndGet源码分析-UnSafe类 compar ...
最新文章
- 深度学习框架 通道顺序
- amba simple class驱动_学习笔记:class加载器和双亲委派模型
- 左手技术右手商业 网易智企全新业务版图亮相
- leetcode--130. 被围绕的区域
- 配置exchange 2010高可用群集服务(dag)
- Spring Cloud综合实战 - 基于TCC补偿模式的分布式事务
- 【ArcGIS遇上Python】python批量获取栅格数据四至(top,bottom,left,right)坐标代码
- 跳台阶问题:动态规划,公式
- mysql where 大小写_java – 使用select where where Mysql在Mysql中区分大小写
- Plugin ‘scala’ is incompatible with this installation
- JAVA 语言如何进行异常处理,关键字: throws,throw,try,catch,finally分别代表什么意义? 在try块中可以抛 出异常吗?...
- vscode设置templates_Vscode中快速创建自定义代码模板的方法
- 雨流计数法的matlab实现,采用三点法与四点法
- Android 配置SUPL
- 深度学习实例——Flappy Bird
- 解决win10任务栏卡死无响应点不动
- 巴比特专访丨Afri谈退出以太坊:再见,“分手”后依然是朋友
- 知识图谱用于推荐系统问题(MKR,KTUP,KGAT)
- nvivo是什么,为什么要学习nvivo,如何学?
- snmp trap发送及接收