首先两阶段终止模式不是23种传统设计模式中的,它是由
黄文海在《Java多线程编程实战指南 设计模式》中所提到的模式,现一共可归纳为36种设计模式
- 当我们想要结束一个线程或者关闭jvm的时候,通过此模式可以优雅安全的关闭线程,让线程可以完成它本应完成的当前任务并可以附加一些收尾工作后再进行关闭
- 此模式下关闭线程会有一定延迟,主要在于被关闭线程需要执行完后,再进行关闭
- 首先Java jdk中并没有关于安全的直接的停止线程的Api 我知道你想到了Interrupt
Interrupt快速解读传送门 http://blog.csdn.net/crazyzxljing0621/article/details/56666418
此模式的设计其实没什么精髓之处,其实就是线程中不断对一个参数进行验证,满足条件时线程跳出并执行结束后的收尾工作,最后安全关闭。
在表现此模式以前我们先把volatile再复习一下 传送门http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
volatile的简单例子
public class s1 {
public volatile static int v1 = 0;
public static int v2 = 0;
public static int v3 = 0;
public volatile static int v4 = 0;
public static AtomicInteger v5 = new AtomicInteger(0);
public static void inc() {
try {
Thread.sleep(3);
} catch (InterruptedException e) {
}
v1++;
v2++;
v5.getAndIncrement();
synchronized (s1.class) {
v3++;
v4++;
}
}
public static void main(String[] args) throws InterruptedException {
Thread threads[]=new Thread[1000];
for (int i = 0; i < 1000; i++) {
threads[i]=new Thread(new Runnable() {
@Override
public void run() {
inc();
}
});
threads[i].start();
}
for(Thread t:threads)
t.join();
System.out.println("运行结果v1:Counter.count=" + s1.v1);
System.out.println("运行结果v2:Counter.count=" + s1.v2);
System.out.println("运行结果v3:Counter.count=" + s1.v3);
System.out.println("运行结果v4:Counter.count=" + s1.v4);
System.out.println("运行结果v5:Counter.count=" + s1.v5);
}
}
运行结果v2:Counter.count=998