一,Two-Phase Termination模式

翻译过来就是:分两阶段终止

二,示例程序

public class CountupTread extends Thread {

    private long counter = 0;
private volatile boolean shutdownRequested = false; //中止请求
public void shutdownRequest(){
shutdownRequested = true;
interrupt();//中断所有等待队列中的线程
} //检查是否发出了终止请求
public boolean isShutdownRequested(){
return shutdownRequested;
} //线程体
@Override
public void run() {
try {
while (!isShutdownRequested()){
doWork();
}
}catch (InterruptedException e){ }finally {
doShutdown();
}
} //终止处理
private void doShutdown() {
System.out.println("doShutdown:counter = "+counter);
} //正常操作
private void doWork()throws InterruptedException {
counter++;
System.out.println("doWork :counter = "+counter);
Thread.sleep(500); } }
public class Test {
public static void main(String[] args) {
System.out.println( " main : begin ");
try {
//启动线程
CountupTread t = new CountupTread();
t.start(); //模拟处理业务
Thread.sleep(10000);
//线程的终止请求
System.out.println(" main shutdownRequest");
t.shutdownRequest(); System.out.println(" main : join");
//等待线程终止
t.join(); }catch (InterruptedException e){ }
System.out.println( " main : end ");
} }

三,特点

安全地终止线程
必定会进行终止处理
发出终止请求后尽快进行终止处理

四,java.util.cocurrent包与线程同步

1.CountDownLatch类

public class CountdownLatchTest {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
final CountDownLatch cdOrder = new CountDownLatch(1);
final CountDownLatch cdAnswer = new CountDownLatch(3);
for (int i = 0; i < 3; i++) { Runnable runnable = new Runnable() {
@Override
public void run() {
try {
System.out.println("线程"+Thread.currentThread().getName()+"正准备接受命令");
//cdOrder的初始值为1,当线程执行到cdOrder.await();会阻塞在这里。
// 当执行了cdOrder.countDown();会减为0,一旦为0,就开始继续执行
cdOrder.await();
System.out.println("线程"+Thread.currentThread().getName()+"已经接受命令");
Thread.sleep((long) (Math.random()*10000));
System.out.println("线程"+Thread.currentThread().getName()+"回应命令处理结果");
//共有三个线程,每个线程执行到这里,cdAnswer就会减少一个
cdAnswer.countDown(); }catch (InterruptedException e){ }
}
};
executorService.execute(runnable);
}
try {
Thread.sleep((long) (Math.random()*10000));
System.out.println("线程"+Thread.currentThread().getName()+"即将发布命令");
cdOrder.countDown();
System.out.println("线程"+Thread.currentThread().getName()+"已经发送命令,正在等待结果");
//cdAnswer初始值是3,主线程执行到这里时会阻塞,直到上面的cdAnswer.countDown();减少为0,
//主线程才继续执行
cdAnswer.await();
System.out.println("线程"+Thread.currentThread().getName()+"已经收到所有响应结果");
}catch (Exception e){ }
executorService.shutdown(); }
}

2.CyclicBarrier类

public class CyclicBarrirTest {

    public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
final CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
for (int i = 0; i < 3; i++) {
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
Thread.sleep((long) (Math.random()*10000));
System.out.println("线程"+Thread.currentThread().getName()+"即将到达集合地点" +
",当前已经有 "+(cyclicBarrier.getNumberWaiting()+1)+"已经到达。"+
(cyclicBarrier.getNumberWaiting()==2?"都到齐了,一起走啊":"继续等待")); cyclicBarrier.await(); }catch (InterruptedException e){ }catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
};
executorService.execute(runnable);
}
executorService.shutdown();
} }

多线程系列之十一:Two-Phase Termination模式的更多相关文章

  1. Java 设计模式系列(十一)享元模式

    Java 设计模式系列(十一)享元模式 Flyweight 享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 一.享元模式的结构 享元模式采用一个共享来避免大量拥有相同内容对 ...

  2. 多线程系列之九:Worker Thread模式

    一,Worker Thread模式 也叫ThreadPool(线程池模式) 二,示例程序 情景:一个工作车间有多个工人处理请求,客户可以向车间添加请求.请求类:Request定义了请求的信息和处理该请 ...

  3. Java多线程编程模式实战指南(三):Two-phase Termination模式

    停止线程是一个目标简单而实现却不那么简单的任务.首先,Java没有提供直接的API用于停止线程.此外,停止线程时还有一些额外的细节需要考虑,如待停止的线程处于阻塞(等待锁)或者等待状态(等待其它线程) ...

  4. Java多线程编程模式实战指南(三):Two-phase Termination模式--转载

    本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-t ...

  5. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  6. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  7. Java多线程系列--“JUC锁”05之 非公平锁

    概要 前面两章分析了"公平锁的获取和释放机制",这一章开始对“非公平锁”的获取锁/释放锁的过程进行分析.内容包括:参考代码获取非公平锁(基于JDK1.7.0_40)释放非公平锁(基 ...

  8. Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock

    概要 Java的JUC(java.util.concurrent)包中的锁包括"独占锁"和"共享锁".在“Java多线程系列--“JUC锁”02之 互斥锁Ree ...

  9. Java多线程系列--“JUC线程池”02之 线程池原理(一)

    概要 在上一章"Java多线程系列--“JUC线程池”01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析Th ...

随机推荐

  1. oracle- 数据表分区

    1. 表分区概念 分区表是将大表的数据分成称为分区的许多小的子集.倘若硬盘丢失了分区表,数据就无法按顺序读取和写入,导致无法操作. 2. 表分区分类 (1)范围分区 create table tabl ...

  2. 将正在运行的Proxmox EV5.x版本更新到最新版本

    问题描述: 最近搭建了一个KVM开源虚拟化平台 Proxmox Virtual Environment是一种基于QEMU / KVM和LXC的开源服务器虚拟化管理解决方案.您可以使用集成的,易于使用的 ...

  3. LeetCode算法题-Number of Boomerangs(Java实现)

    这是悦乐书的第231次更新,第244篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第98题(顺位题号是447).给定平面中的n个点都是成对不同的,"回旋镖&qu ...

  4. LeetCode算法题-Valid Palindrome(Java实现)

    这是悦乐书的第174次更新,第176篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第33题(顺位题号是125).给定一个字符串,确定它是否是回文,只考虑字母数字字符并忽略 ...

  5. 谱聚类算法(Spectral Clustering)优化与扩展

    谱聚类(Spectral Clustering, SC)在前面的博文中已经详述,是一种基于图论的聚类方法,简单形象且理论基础充分,在社交网络中广泛应用.本文将讲述进一步扩展其应用场景:首先是User- ...

  6. Word中的通配符随意组合进行批量替换或删除某些内容

    长文档需要批量修改或删除某些内容的时候,我们可以利用Word中的通配符来搞定这一切,当然,前提是你必须会使用它.通配符的功能非常强大,能够随意组合替换或删除我们定义的规则内容,下面易老师就分享一些关于 ...

  7. C. Lorenzo Von Matterhorn LCA

    C. Lorenzo Von Matterhorn time limit per test 1 second memory limit per test 256 megabytes input sta ...

  8. Rancher学习笔记----在UI界面添加主机页面无法正常显示

    今天在学习rancher添加主机的时候,遇到了一个小问题,但是困扰老娘一上午 问题描述:在点击添加主机的时候,页面有跳转,但是页面显示为空,没有任何可选项.如下正常界面: 解决办法是:请换个浏览器

  9. YOLO 从数据集制作到训练

    1.图片数据集收集 共 16种 集装箱船 container ship 散货船 bulker 油船 tanker 游轮 / 客轮 / 邮轮 passenger liner 渔船 fishing boa ...

  10. Quartz Cron表达式详解

    转:https://www.jianshu.com/p/f03b1497122a 本文包含如下内容 CronTrigger简介 Cron 表达式 Cron表达式可选的值 Cron表达式的配置规则 Cr ...