引子:两阶段终止设计模式
大家可以看一下我专门写两阶段终止模式博客:
两阶段终止设计模式
public class Test_TwoModelStop {
public static void main(String[] args) throws InterruptedException {
ShareClass shareClass1=new ShareClass();
new Thread(()->{
shareClass1.startmonitorthread();
}).start();
Thread.sleep(10);
shareClass1.stopmonitorthread();
}
}
class ShareClass{
private volatile boolean stopflag=false;
private Thread montiorthread;
public void startmonitorthread(){
montiorthread=new Thread(()->{
while (true){
if (stopflag){
System.out.println("料理后事");
break;
}
}
},"montiorthread");
montiorthread.start();
}
public void stopmonitorthread(){
stopflag=true;
}
}
犹豫模式
犹豫模式是通过一个标记来表示某段代码是否被执行过?如果希望只被执行一次那么判断标记就可以知道是否被执行过,这就是犹豫模式。
例如两阶段终止模式在主线程中多次调用start那么就会多次创建监控线程,如果不想多次创建此时就需要犹豫模式来对代码进行优化!
假如主线程多次调用start,但我们想只需要创建一次监控线程就行!
public static void main(String[] args) throws InterruptedException {
ShareClass shareClass1=new ShareClass();
new Thread(()->{
shareClass1.startmonitorthread();
}).start();
shareClass1.startmonitorthread();
shareClass1.startmonitorthread();
shareClass1.startmonitorthread();
Thread.sleep(10);
shareClass1.stopmonitorthread();
}
}
- 犹豫模式设计
public void startmonitorthread(){
synchronized (this){
if (balking){
return;
}
balking=true;
}
montiorthread=new Thread(()->{
while (true){
}
},"montiorthread");
montiorthread.start();
}
主要的改动就是加了这里
synchronized (this){
if (balking){//判断犹豫标记
return;
}
balking=true;
}
先判断犹豫的标记是否为真(为真则是下面这块代码已经运行过了),为假则是没运行过(当然要之后要设置为false)。当我们停止监控线程时在吧犹豫标记改回来!
犹豫模式用处比较多例如单例模式。。。。