Two-phapse-Termination[A终止B线程]

一:Two-phapse-Termination的参与者
--->A线程
--->B线程

二:Two-phapse-Termination模式什么时候使用
--->当A线程需要B线程终止时

三:Two-phapse-Termination思考
       ---> 优雅的终止线程
        (1)安全地终止(安全性)==>即使收到终止请求,也不会马上结束线程,而是表示收到终止请求的标识。以对象不被损坏为前提,安全终止
        (2)一定会进行终止处理(生命性)==>当收到终止请求,会中断掉可以中断的wait,前往终止处理。异常处理要非常小心,防止抛出异常,破坏对象。
        (3)送出终止请求后,要尽快进入终止处理(响应性)==>当收到终止请求,可以中断掉Sleep,尽快终止处理

四进阶说明        
--->首先来说说java中的中断机制,Java 中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。当调用interrupt()方法的时候,只是设 置了要中断线程的中断状态,而此时被中断的线程的可以通过isInterrupted()或者是interrupted()方法判断当前线程的中断状态是

--->interrupte()和interrupted()和isInterrputed()方法的区别
        (1)线程对象.interrupte()是将调用该方法的对象所指的线程的中断状态修改为:【中断状态】
        (2)Thead.interrputed()是检查当前线程的中断状态,如果为中断状态,则返回true,并将中断状态清除掉。如果为非中断状态,返回false
        (3)线程对象.isInterrputed()是返回当前线程是否为中断状态,并不会修改线程的中断状态

---->wait方法被中断后,不会立马跑出InterrptedException,而是要重新获取锁定,才可抛出该异常。

--->书上一种解释:
        A线程中b.interrput()执行,B线程正处于sleep或wait状态,则会立马提前放弃休眠或等待,抛出interrputedException异常。线程的【中断状态】会立马被清除掉。
        【测试未得到印证】
-->书上另一种解释
        A线程中b.interrpt()执行,B线程刚开始准备执行sleep或wait,执行时会检查线程的状态,如果为中断状态,则跑出InterrptedException异常。线程的【中断状态】会立马被清除掉。

Two-phapse-Termination 例子
主线程A(要停掉B线程)

 package com.yeepay.sxf.thread10;
/**
* 测试主线程A线程
* @author sxf
*
*/
public class Test {
public static void main(String[] args) {
//开启收拾玩具的线程
CountAddThread addThread=new CountAddThread();
//开启线程
new Thread(addThread).start();
//让主线程休息5秒
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//关闭收拾玩具线程
addThread.shutDownRequest(); }
}

线程B(要被A线程停掉)

 package com.yeepay.sxf.thread10;

 public class CountAddThread extends Thread{
//计数器
private Integer counter=0; //当发送出停止线程的请求,该值设置为true
private volatile boolean flag=false; @Override
public void run() {
try {
while (!flag) {
doWork();
if(this.interrupted()){
System.out.println("CountAddThread.run(中断)");
}else{
System.out.println("CountAddThread.run(非中断)");
}
System.out.println("CountAddThread.run(sleep after收拾玩具个数:)"+counter);
}
} catch (Exception e) {
System.out.println("CountAddThread.run(取消sleep后,抛出异常抓住,收拾玩具个数:)"+counter);
e.printStackTrace();
}finally{
shutDownDoWork();
} } //具体工作内容
public void doWork() throws InterruptedException {
counter++;
System.out.println("CountAddThread.doWork(收拾玩具第)"+counter+"次数");
// Thread.sleep(10);
} //发送终止请求
public void shutDownRequest(){
System.out.println("CountAddThread.shutDownRequest(终止线程方法的请求启动)");
flag=true;
//将线程设置为中断状态
interrupt();
//判断this线程是否为中断状态
if(this.isInterrupted()){
System.out.println("CountAddThread.shutDownRequest(线程是中断)");
}else{
System.out.println("CountAddThread.shutDownRequest(线程为非中断状态)");
} } //判断终止请求是否已经发出
public boolean isShutDown(){
return flag;
} public void shutDownDoWork(){
System.out.println("CountAddThread.shutDownDoWork(结束请求后counter=>"+counter+")");
} }

一种异常抛出的实现

 package com.yeepay.sxf.thread10;
/**
* 抛异常一种实现
* @author sxf
*
*/
public class TestException { private Exception exception=null; public static void main(String[] args) {
TestException ex=new TestException();
try {
ex.addtest();
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("TestException.main()"+e);
}
} public void addtest() throws Exception{
try {
int a=1/1;
} catch (Exception e) {
exception=e;
}
System.out.println("异常被抓住,但没抛,也没打印,而是赋值给别的对象,后边再抛");
if(exception!=null){
throw exception;
}
System.out.println("抛异常后边不可以写代码,也不会执行");
} }

多线程程序设计学习(11)Two-phapse-Termination pattern的更多相关文章

  1. 多线程程序设计学习(3)immutable pattern模式

    Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者        1.1:immutable参与者是一个 ...

  2. 多线程程序设计学习(10)Future pattern

    Future pattern[订单取货模式] 一:Future pattern的参与者--->Client(客户需求)--->Host(蛋糕门店)--->Data(票据和蛋糕的接口) ...

  3. 多线程程序设计学习(9)worker pattern模式

    Worker pattern[工作模式]一:Worker pattern的参与者--->Client(委托人线程)--->Channel(通道,里边有,存放请求的队列)--->Req ...

  4. 多线程程序设计学习(2)之single threaded execution pattern

    Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResourc ...

  5. 多线程程序设计学习(7)read-write lock pattern

    Read-Write Lock Pattern[读写]一:Read-Write Lock Pattern的参与者--->读写锁--->数据(共享资源)--->读线程--->写线 ...

  6. 多线程程序设计学习(13)Active Object pattern

    Active Object[接收异步消息的对象] 一:Active Object的参与者--->客户端线程(发起某种操作请求处理)--->代理角色(工头)--->实际执行者(工人)- ...

  7. 多线程程序设计学习(12)Thread-soecific storage pattern

    Thread-Specific-Storage[线程保管箱] 一:Thread-Specific Storage的参与者--->记录日志的线程(ClientThread)--->负责获取不 ...

  8. 多线程程序设计学习(6)Producer-Consumer模式

    Producer-Consumer[生产消费者模式]一:Producer-Consumer pattern的参与者--->产品(蛋糕)--->通道(传递蛋糕的桌子)--->生产者线程 ...

  9. 多线程程序设计学习(5)balking模式和timed模式

    Balking[返回模式]timed[超时模式]一:balking pattern的参与者--->GuardedObject(被警戒的对象) --->该模式的角色:模拟修改警戒对象的线程, ...

随机推荐

  1. 地形图比例尺、等高距和DEM分辨率关系

    地表面的形态是很复杂的,不同地貌类型的形态是由它的相对高度、地面坡度以及所处的地势所决定的,它们是影响等高距的主要因素。从等高距计算公式可以看出,当地图比例尺和图上等高线间的最小距离简称等高线间距确定 ...

  2. C#...何时需要重写ToString()方法?

    一般类型,都是继承自System.Object类,默认情况下,object类的ToString方法会返回当前类的类型的字符串表达形式.但也有例外!! DateTime,它就重写ToString方法,D ...

  3. Android模拟神器Genymotion eclipse插件安装问题出解决

    我之前一直是打开eclipse之前直接运行Genymotion模拟器就可以连接到adb了,非常方便,但最近突然想来装个eclipse的Genymotion插件玩玩,安装时居然出错了,于是不折腾好心里不 ...

  4. ios App 打包

    ios 版本的 App 打包两种方式: 1. 命令行 xcodebuild exportArchive -exportFormat ipa 2. 通过 xcode Product -> Arch ...

  5. poj 2762 Going from u to v or from v to u?(强连通分量+缩点重构图+拓扑排序)

    http://poj.org/problem?id=2762 Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit:  ...

  6. Maven 解决JAR包冲突

    在JAR 冲突的情况下, 利用Eclipse方式解决JAR包冲突时比较方便简洁的,步骤如下 1. 在Eclipse 中打开pom.xml , 选择  “Dependency  Hierarchy” 2 ...

  7. C#中 Thread.Sleep精度问题

    Thread.Sleep的精度默认在15ms左右,如果需要类似 Thread.Sleep(1)的精细控制,需要调用特定的平台API实现 [DllImport("winmm.dll" ...

  8. 软件调试之INT 3讲解

    第4章断点和单步执行 断点和单步执行是两个经常使用的调试功能,也是调试器的核心功能.本章我们将介绍IA-32 CPU是如何支持断点和单步执行功能的.前两节将分别介绍软件断点和硬件断点,第4.3节介绍用 ...

  9. 深入理解SQL注入绕过WAF与过滤机制

    知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...

  10. Kafka操作

    http://blog.csdn.net/xiao_jun_0820/article/details/46831203 http://blog.csdn.net/xcockroach/article/ ...