`
Supanccy2013
  • 浏览: 222961 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java多线程-Balk模式(退缩不前模式)

阅读更多
    在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服务器vb

    - FTP协议包含了许多复杂的交互细节,如错误处理、状态维护、多线程并发处理等,都需要在代码中妥善处理。 6. **社区参与的价值**: - 鉴于该项目可能不完整,公开讨论可以帮助开发者发现和修复潜在的问题,增强...

    FTP.rar_FTP服务器程序_ftp_ftp java_ftp上传下载_java ftp

    6. **Balk.cls**:可能是一个辅助类,处理特定的服务器行为,如错误处理、日志记录等。 7. **burro.exe**:可能是服务器的可执行文件,负责启动和运行FTP服务。 8. **UserOpts.frm** 和 **frmFtp.frm**:这两个文件...

    羽毛的英语单词参考.doc

    20. 连续扣杀(Consecutive kill):连续多次成功的扣球攻势。 21. 防守反击(Defence and fight back):从防守状态转为进攻的策略。 22. 轮换位置(Switch position):双打比赛中,队员在场上变换位置。 此外,...

    基于ATmega16-16PC单片机超声波测距避障小车源程序+PDF原理图.zip

    if (1 == is_balk()) { //printStr("have balk!\n"); while (is_balk()) { motor_rotate(); } //printStr("no balk!\n"); } else { motor_forward(); } //_delay_ms(100); } ...

    1853-Most-Difficult-Words-(for-GRE,-CAT,-GMAT).pdf

    43. **balk** - **含义**:犹豫,拒绝。 - **例句**:He balked at the idea of moving to another city. 44. **banal** - **含义**:陈词滥调的,乏味的。 - **例句**:The banal conversation bored ...

    FTP server VB

    - **Balk.cls**:可能是一个自定义控件或类,用于显示进度或状态信息。 - **burro.exe**:可能是一个辅助执行文件,用于支持FTP服务器的特定功能。 - **UserOpts.frm**:用户选项表单,可能让用户配置服务器设置...

    nefit-easy-http-server:HTTP服务器通过HTTP访问NefitBosch XMPP后端

    更多信息。 如果要构建自己的Docker映像,则此存储库中包含一个Dockerfile 。 最近Linux发行版中的问题 如果您在从HTTP服务器获取任何数据时遇到问题,并且正在使用最新Linux发行版(例如Raspbian Buster),请...

    MATLAB中DEA代码-DEACrossEfficiencyMATLAB:用于MATLAB的DEA交叉效率工具箱

    所有这些模型都在以下出版物中进行了详细介绍:Balk,BM和de Koster,MBM和Kaps,C。和Zofío,JL,2017年。“对交叉效率方法的评估,用于衡量仓库绩效,” ERIM报告管理系列研究ERS-2017-015-LIS,伊拉斯姆斯管理...

    中级口译有关的新闻词

    虽然“coup”一词在政治领域更为常见,但在IT变革管理中,它也可以比喻为重大转型或创新举措,如企业架构重组、业务模式转变或采用颠覆性的新技术。这类变革往往伴随着风险和机遇,需要精心规划和执行。 以上仅是...

    工程_C

    在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

    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

Global site tag (gtag.js) - Google Analytics