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—— 任务取消相关推荐

  1. Java并发编程(07):Fork/Join框架机制详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Fork/Join框架 Java提供Fork/Join框架用于并行执行任务,核心的思想就是将一个大任务切分成多个小任务,然后汇总每个小任务 ...

  2. 并发编程实战:取消和关闭

    任务和线程的启动很容易.在大多数时候,我们都会让它们运行直到结束,或者让它们自行停止.然而,有时候我们希望提前结束任务或线程,或许是因为用户取消了操作,或者应用程序需要被快速关闭. 要使任务和线程能安 ...

  3. Java 并发编程之任务取消(五)

    停止基于线程的服务 正确的封装原则是:除非拥有某个线程,否则不能对该线程进行操控.例如中断线程或修改线程的优先级等 .那么什么 是拥有某个线程呢,就是创建该线程的类,一般来说线程池是其工作线程的所有者 ...

  4. 实战并发编程 - 07循环等待死锁问题

    文章目录 Pre 什么是死锁 死锁代码 死锁产生的原因 如何避免死锁 1. 破坏占用且等待条件 2. 破坏不可抢占条件 3.破坏循环等待条件 小结 Pre [账户A]转账给[账户B],同时[账户B]也 ...

  5. 【JUC并发编程07】Callable接口

    文章目录 7 Callable接口 7.1 Callable接口创建线程 7.2 FutureTask 7 Callable接口 创建线程的多种方式: 继承Thread类 实现Runnable接口 C ...

  6. 并发编程-06线程安全性之可见性 (synchronized + volatile)

    文章目录 线程安全性文章索引 脑图 可见性定义 导致不可见的原因 可见性 -synchronized (既保证原子性又保证可见性) 可见性 - volatile(但不保证操作的原子性) volatil ...

  7. 并发编程-05线程安全性之原子性【锁之synchronized】

    文章目录 线程安全性文章索引 脑图 概述 原子性synchronized 修饰的4种对象 修饰代码块 作用范围及作用对象 Demo 多线程下 同一对象的调用 多线程下不同对象的调用 修饰方法 作用范围 ...

  8. 并发编程-04线程安全性之原子性Atomic包的4种类型详解

    文章目录 线程安全性文章索引 脑图 概述 原子更新基本类型 Demo AtomicBoolean 场景举例 原子更新数组 Demo 原子更新引用类型 Demo 原子更新字段类型 使用注意事项: Dem ...

  9. 并发编程-03线程安全性之原子性(Atomic包)及原理分析

    文章目录 线程安全性文章索引 脑图 线程安全性的定义 线程安全性的体现 原子性 使用AtomicInteger改造线程不安全的变量 incrementAndGet源码分析-UnSafe类 compar ...

最新文章

  1. 深度学习框架 通道顺序
  2. amba simple class驱动_学习笔记:class加载器和双亲委派模型
  3. 左手技术右手商业  网易智企全新业务版图亮相
  4. leetcode--130. 被围绕的区域
  5. 配置exchange 2010高可用群集服务(dag)
  6. Spring Cloud综合实战 - 基于TCC补偿模式的分布式事务
  7. 【ArcGIS遇上Python】python批量获取栅格数据四至(top,bottom,left,right)坐标代码
  8. 跳台阶问题:动态规划,公式
  9. mysql where 大小写_java – 使用select where where Mysql在Mysql中区分大小写
  10. Plugin ‘scala’ is incompatible with this installation
  11. JAVA 语言如何进行异常处理,关键字: throws,throw,try,catch,finally分别代表什么意义? 在try块中可以抛 出异常吗?...
  12. vscode设置templates_Vscode中快速创建自定义代码模板的方法
  13. 雨流计数法的matlab实现,采用三点法与四点法
  14. Android 配置SUPL
  15. 深度学习实例——Flappy Bird
  16. 解决win10任务栏卡死无响应点不动
  17. 巴比特专访丨Afri谈退出以太坊:再见,“分手”后依然是朋友
  18. 知识图谱用于推荐系统问题(MKR,KTUP,KGAT)
  19. nvivo是什么,为什么要学习nvivo,如何学?
  20. snmp trap发送及接收

热门文章

  1. Hue由于主备NameNode切换引发的问题
  2. Python爬虫之(五)Cookie和URLError
  3. java年龄不能超过120,systemd 代码行数超过 120 万,创始人贡献的 commits 最多
  4. Exception处理
  5. Windows MongoDB安装配置
  6. 如何用方正飞腾做出“凹”形文本框
  7. 小学 学生学籍信息汇总及自动检查代码(Python)
  8. C#实现WebService服务 项目完整总结
  9. HP刀片服务器C7000-Cisco网络模块配置指南
  10. 配置和调试EIGRP