一,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. python中根据字符串导入模块module

    python中根据字符串导入模块module 需要导入importlib,使用其中的import_module方法 import importlib modname = 'datetime' date ...

  2. [Hive_add_3] Hive 进行简单数据处理

    0. 说明 通过 Hive 对 duowan 数据进行简单处理 1. 操作流程 1.1 建表 create table duowan(id int, name string, pass string, ...

  3. 优雅的使用Spring

    Bean声明的三种方式: 1.@Component, @Service, @Repository,@Controller 用于声明一个组件,程序启动时会扫描这些组件,并创建实例. 2.在applica ...

  4. sqli-labs安装

      平台:Win7 SP1     需要准备的东西:   1. Sqli-labs ,下载地址: https://github.com/Audi-1/sqli-labs   2.phpstudy   ...

  5. LeetCode算法题-Contains Duplicate II(Java实现)

    这是悦乐书的第193次更新,第197篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第53题(顺位题号是219).给定整数数组和整数k,找出数组中是否存在两个不同的索引i和 ...

  6. mybatis中使用Integer类型的参数<if>判断问题

    mybatis对传入参数进行判断时,会使用if标签, 一般是判断不为null和'', 如下: <if test="name != null and 那么 != ''"> ...

  7. 你可能不知道的printf

    前言 printf可能是我们在学习C语言的过程中最早接触的库函数了.其基本使用想必我们都已经非常清楚了.但是下面的这些情况你是否已经清楚地知道了呢? 示例程序 我们来看一个示例程序,看看你能否对下面的 ...

  8. 基于mycat高可用方案——数据库负载

    引言 传统企业级应用一般采取单台数据库,吞吐所有应用的读写,随着互联网的高速发展,以及微服务架构越来越普及,往往采用分库分表来支撑高速增长的大量业务数据吞吐.分库分表主要有两种方式:水平分表和垂直分库 ...

  9. public private protected default

    public private protected default 这几个限定访问控制符只是在编译阶段起作用,在运行阶段不起作用 private修饰符 , 本类可以访问 default修饰符 , 本类, ...

  10. NET缓存框架CacheManager在混合式开发框架中的应用(1)-CacheManager的介绍和使用

    在我们开发的很多分布式项目里面(如基于WCF服务.Web API服务方式),由于数据提供涉及到数据库的相关操作,如果客户端的并发数量超过一定的数量,那么数据库的请求处理则以爆发式增长,如果数据库服务器 ...