Balking Pattern 与 Guarded Suspension Pattern 都需要警戒条件,只不过Balking Pattern中,当警戒条件不成立时,不进行wait,直接中断。
Balking Pattern的适用性:
1.不需要刻意执行的时候,balk可以提高性能
2.不想等待警戒条件成立的时候
3.警戒条件只需第一次成立的时候,例如初始化操作
例子:仅类似“自动保存功能”,通过此模式,防止重复保存。
所需的类:
Date:数据类;
AutosaverThread:定期自动保存数据的线程类;
ChngsaverThread:自己修改并保存的线程类;
Main:测试类
//Date.java
import java.io.FileWriter;
import java.io.IOException;
public class Date {
public final String filename; //保存的文件名
public String context; //保存的内容
public boolean changedFlag; //若内容修改后,没被保存,则为true
public Date(String filename , String context){
this.filename = filename;
this.context = context;
this.changedFlag = true;
}
//内容修改方法
public synchronized void change(String newcontext){
context = newcontext;
changedFlag = true;
}
//若内容有修改,则保存
public synchronized void save() throws IOException{
if(!changedFlag){ //警戒条件
return; //即balk操作,若已保存或未修改,则终止操作
}
doSave();
changedFlag = false;
}
//实际将数据保存到文件中的方法
public void doSave() throws IOException{
System.out.println(Thread.currentThread().getName() + " calls doSave, context:" + context);
FileWriter fw = new FileWriter(filename);
fw.write(context);
fw.close();
}
}
//AutosaverThread.java
import java.io.IOException;
public class AutosaverThread extends Thread{
private Date date;
AutosaverThread(String name , Date date){
super(name);
this.date = date;
}
public void run(){
try{
while(true){
date.save();
Thread.sleep(1000);
}
}catch(InterruptedException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
}
//ChngsaverThread.java
import java.io.IOException;
import java.util.Random;
public class ChngsaverThread extends Thread{
private Date date;
private Random random = new Random();
ChngsaverThread(String name , Date date){
super(name);
this.date = date;
}
public void run(){
for(int i=1; i<21; i++){
try {
date.change("he is fang" + i);
Thread.sleep(random.nextInt(1000));
date.save();
} catch (InterruptedException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
}
//Main.java
public class Main {
public static void main(String[] args) {
Date date = new Date("d.txt", "i am lulu ");
new AutosaverThread("AAAAthread", date).start();
new ChngsaverThread("CCCCthread", date).start();
}
}
分享到:
相关推荐
书中包含Java线程的介绍导读、12个重要的线程设计模式和全书总结以及丰富的附录内容。第一章相关线程设计模式的介绍,都举一反三使读者学习更有效。最后附上练习问题,让读者可以温故而知新,能快速地吸收书中的...
目录: 漫谈UML Introduction 1 Java语言的线程 Introduction 2 多线程...总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的优先级 附录D 线程相关的主要API 附录E 参考文献
该模式对于管理多线程 Java 应用程序中的状态和并发至关重要。 三、Balking 模式的详细解释及实际示例 实际示例: Balking 设计模式的一个现实世界类比可以在洗衣服务中看到。想象一下自助洗衣店中的洗衣机,只有在...
Java中的Balking模式是一种多线程设计模式,它主要用于处理多个线程可能对同一资源进行操作的情况,但当发现其他线程已经准备执行相同的操作时,一个线程会选择放弃执行,避免不必要的竞争条件和资源浪费。这个模式...
Java多线程模式详解 目录: 一、漫谈UML Java语言的线程 多线程的评量标准 二、 1、Single Threaded Execution ———— 能通过这座桥的,只有一个人 2、Immutable ———— 想破坏它也没办法 3、Guarded ...
记录自己学习《图解Java多线程设计模式》这本书的全部过程 本书上传的所有代码都是可以运行的,在此附上本书源码地址: 在此向本书作者和译者表示感谢 运行环境 Eclipse版本:Oxygen.2 Release (4.7.2) JDK版本:jdk...
│ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...
│ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...
- **Balking模式**:用于避免不必要的同步操作,如果发现资源状态不需要同步时,则不会进入临界区。 - **读写锁(Read/Write Lock)**:允许多个线程同时读取共享资源,但在写入时只允许一个线程访问。 - **生产...
值得注意的是,当客户到达但未加入队列,我们称之为“拒载”(balking)。 服务过程是队列理论的另一个核心要素,它涉及到客户服务时间的分布。服务时间可以是均匀的,也可以遵循其他概率分布,如指数分布。服务...
- 当需要提高多线程环境下的性能时,因为不可变对象可以安全地在多个线程之间共享。 #### 1.4 标记接口(Marker Interface) **使用:** 标记接口是一种特殊的接口类型,它没有任何方法声明。它主要用于表示某种...
消息可以有不同类型,包括同步消息(sync)、异步消息(async)、超时消息(time-out)以及阻塞消息(Uncommitted / Balking)等。 同步消息通常会导致发送方等待接收方的响应,而异步消息则允许发送方在不等待响应...