在GuardedSuspensionPattern保护暂停模式中,我们知道两个线程操作操作临界资源,其中一个线程生产临界资源,另一个消费临界资源,后者需要临界资源的数量必须大于0,如果不大于0线程就会进入临界资源实例的等待区(wait),直到生产线程生产了一个临界资源,之后通知所有在临界资源实例的等待区的所有等待线程,等待线程得到通知后再继续去消费临界资源。
今天要介绍的是balk模式,退缩不前模式,意思就是当一个线程要去操作临界资源,在操作的时候需要判断一下是否满足操作的条件,如果满足就操作临界资源,不满足就直接return,而不是保护暂停模式中的“继续等待,直到条件满足”。
需求:当编辑一个文本文件时:要提供认为手动保存功能,和自动保存功能,自动保存的时候如果文本根本没有变化,则直接return 。我们通过两个线程来实现,一个线程负责编辑和认为保存,一个线程是自动保存功能。
涉及的类有:
1,Data类:表示临界资源
2,SaverThread :模拟自动保存的线程类
3,ChangerThread :模拟人为修改和人为保存的类
4,Main:测试类
代码如下:
package balking;
import java.io.FileWriter;
import java.io.IOError;
import java.io.IOException;
import java.io.Writer;
/*
* 表示现在数据(临界资源)的类
*/
public class Data {
private final String filename;
private String content;
private boolean changed;
public Data(String filename,String content){
this.filename = filename;//保存时的文件名
this.content = content;//数据的内容
this.changed = true;//修改后的内容还没保存的话,值为true
}
public synchronized void change(String newContent){//在多线程中操作临界资源的方法都必须用synchronized修饰
content = newContent;
changed = true;//修改后的内容还没保存的话,值为true
}
public synchronized void save()throws IOException{//在多线程中操作临界资源的方法都必须用synchronized修饰
if(!changed){//如果已经保存则直接return。
return;
}
doSave(); //否则保存
changed = false;//保存后设置”是否需要保存的标志为"false
}
private void doSave()throws IOException{//注意该类并不需要用synchronized修改,因为该类是私有的,并且调用该方法的save()已经被synchronized修饰过
System.out.println(Thread.currentThread().getName() + "calls doSave,content = " + content);
Writer writer = new FileWriter(filename);//每次保存文件都会备份之间的文件,并且生成新的文件。
writer.write(content);
writer.close();
}
}
package balking;
import java.io.IOException;
/*
* 该线程类的实例主要用来模拟自动保存文件(每个一秒钟)
* 注意纵然该类用了一个死循环来一直调用data.save()进行文件保存,但并不是每个
* 调用save都执行了writer写操作,而是每次调用save时会首先判断该文件
* 是否已经保存了,如果已经保存了就直接返回了,然后再停一秒继续保存。
*/
public class SaverThread extends Thread {
private Data data;
public SaverThread(String name,Data data){
super(name);
this.data = data;
}
public void run(){
try {
while(true){
data.save();
Thread.sleep(1000);
}
}catch(IOException e){
e.printStackTrace();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package balking;
import java.io.IOException;
import java.util.Random;
/*
* 该线程类的实例主要用来模拟人为修改,认为保存功能(修改后隔一分钟再保存)
*/
public class ChangerThread extends Thread{
private Data data;
private Random random = new Random();
public ChangerThread(String name,Data data){
super(name);
this.data = data;
}
public void run(){
try {
for(int i = 0; true; i++){
data.change("No." + i); //改变文件、
Thread.sleep(random.nextInt(1000));
data.save();//保存文件
}
} catch (IOException e) {
e.printStackTrace();
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
package balking;
/*
* 测试类
*/
public class Main {
public static void main(String[] args) {
Data data = new Data("data.tex","(empty");//临界资源实例
new ChangerThread("ChangerThread", data).start();//该线程用来模拟一个人不停的修改,保存文件
new SaverThread("SaverThread", data).start();//该线程用来模拟后台每隔一分钟自动保存文件
}
}
分享到:
相关推荐
- FTP协议包含了许多复杂的交互细节,如错误处理、状态维护、多线程并发处理等,都需要在代码中妥善处理。 6. **社区参与的价值**: - 鉴于该项目可能不完整,公开讨论可以帮助开发者发现和修复潜在的问题,增强...
6. **Balk.cls**:可能是一个辅助类,处理特定的服务器行为,如错误处理、日志记录等。 7. **burro.exe**:可能是服务器的可执行文件,负责启动和运行FTP服务。 8. **UserOpts.frm** 和 **frmFtp.frm**:这两个文件...
20. 连续扣杀(Consecutive kill):连续多次成功的扣球攻势。 21. 防守反击(Defence and fight back):从防守状态转为进攻的策略。 22. 轮换位置(Switch position):双打比赛中,队员在场上变换位置。 此外,...
if (1 == is_balk()) { //printStr("have balk!\n"); while (is_balk()) { motor_rotate(); } //printStr("no balk!\n"); } else { motor_forward(); } //_delay_ms(100); } ...
43. **balk** - **含义**:犹豫,拒绝。 - **例句**:He balked at the idea of moving to another city. 44. **banal** - **含义**:陈词滥调的,乏味的。 - **例句**:The banal conversation bored ...
- **Balk.cls**:可能是一个自定义控件或类,用于显示进度或状态信息。 - **burro.exe**:可能是一个辅助执行文件,用于支持FTP服务器的特定功能。 - **UserOpts.frm**:用户选项表单,可能让用户配置服务器设置...
更多信息。 如果要构建自己的Docker映像,则此存储库中包含一个Dockerfile 。 最近Linux发行版中的问题 如果您在从HTTP服务器获取任何数据时遇到问题,并且正在使用最新Linux发行版(例如Raspbian Buster),请...
所有这些模型都在以下出版物中进行了详细介绍:Balk,BM和de Koster,MBM和Kaps,C。和Zofío,JL,2017年。“对交叉效率方法的评估,用于衡量仓库绩效,” ERIM报告管理系列研究ERS-2017-015-LIS,伊拉斯姆斯管理...
虽然“coup”一词在政治领域更为常见,但在IT变革管理中,它也可以比喻为重大转型或创新举措,如企业架构重组、业务模式转变或采用颠覆性的新技术。这类变革往往伴随着风险和机遇,需要精心规划和执行。 以上仅是...
在Visual Sudio代码中打开地图首次应用程序运行不成功,开始打开地图数据库,并开始使用API。 门操作f5从数据库打开。 d。werkt doordat onderin的je kunt checken和oranje balk hoort te komen en rechtsboven ...
Balk 美国波士顿 Jean-Marc Ballou 法国 Strasbourg,美国 Jeffrey Bartlett Columbus,美国 James Basilion Charlestown,美国 Alfonso Bellacosa , 美国 Jean Bennett 美国费城 Thierry Bettinger 英国伯明翰 ...
Thank you to our reviewers REVIEWERS Thank you to our Reviewers ...Steve Balk Boston, USA Jean-Marc Ballou Strasbourg, France Jeffrey Bartlett Columbus, USA James Basilion Charlestown, USA Alfons