一,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. 远程桌面连接一台关联无线的电脑(A)时,A电脑无线总是断开导致远程桌面连接失败

    1. 我的环境: 两台电脑,分别记为PC1和PC2,PC1有线或者无线连在路由器上,PC2无线连在同一个路由器上.(当然,我的PC1是win10系统,PC2是win7系统) 2.  PC1只要一远程连 ...

  2. 解决“Eclipse中启动Tomcat后,http://localhost:8080/无法访问”的问题

    这个问题是eclipse造成的,我们可以修改配置来实现通过eclipse启动tomcat可以访问http://localhost:8080 打开Server试图(打开前不要启动tomcat),双击其中 ...

  3. 英语进阶系列-A03-英语升级练习一

    古诗背诵 要求:根据诗句,先翻译成现代文,然后绘制图像. 词汇系列 要求:认真朗读单词,然后通过该单词联想2个词汇,然后给每个单词造句. 例子:class班级,联想到了classroom教室,clas ...

  4. Go学习笔记06-内建容器

    Go学习笔记06-内建容器 Go语言 数组 *切片(Slice) #F44336 Slice的操作 Map map示例 字符处理 数组 定义数组: //这样定义数组编译器自动初始化每个元素为0  va ...

  5. 【shell脚本】shell脚本实现的 函数差集查找

    文本地址 点击关注微信公众号 wenyuqinghuai 分享提纲: 1. 问题背景 2. 代码实现 1.问题背景 在做公司的测试的自动化测试时,覆盖了一些开发代码的函数,但是那些还没有做,使用一个函 ...

  6. 17.基于scrapy-redis两种形式的分布式爬虫

    redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...

  7. ubuntu下配置rsync,实现远程备份

    rysnc(remote synchronize)在CentOS系统默认安装在/usr/bin,此外rysnc在windows平台下也有相应版本.主页地址为: http://rsync.samba.o ...

  8. 安利一个_Java学习笔记总结

    javaIO 字符编码 多线程 线程池 ArrayList遍历方式 LinkedList遍历方式 Vector遍历方式 Vector, ArrayList, LinkedList 的区别是什么? Ha ...

  9. [Python] 个人TIPS

    1.查询当前代码路径 import os os.getcwd() 2.尝试大文件读取时,可对pandas显示设置进行调整,使之得到更为全局或者局部的细节显示 pd.options.display.ma ...

  10. [matlab] 23.matlab自带kmeans函数 实现聚类

    clc,clear all; point=[1.40000000000000,0.200000000000000;1.40000000000000,0.200000000000000;1.300000 ...