Java多线程中的Balking模式详解

网友投稿 328 2022-09-01


Java多线程中的Balking模式详解

目录1.场景2.详细说明3.Balking模式的本质:停止并返回源代码如下:总结

1.场景

自动保存功能:

为防止电脑死机,而定期将数据内容保存到文件中的功能。

2.详细说明

当数据内容被修改时,内容才会被保存。即当写入的内容与上次写入的内容一致时,其实就没有必要执行写入操作。也就是说,以”数据内容是否一致”作为守护条件。若数据内容相同,则不执行写入操作,直接返回。

3.Balking模式的本质:停止并返回

如果现在不合适执行该操作,或者没有必要执行该操作,就停止处理,直接返回—-Balking模式。

要实现上述描述的场景,我们需要设计四个类:数据类Data,修改内容的线程类WriterThread,保存数据的线程类,启动线程的类。类图如下:

当数据类Data里的内容被修改时,守护条件”数据内容是否一致”变为false,则进行保存工作:保存工作可由定时保存功能完成也可由修改内容的线程类完成。如果守护条件为true,则直接返回,不执行保存操作。

源代码如下:

数据类

public class Data{

private final String filename;//保存文件的名称

private String content;//数据的内容

private boolean changed;//内容是否已保存的标志,若修改后为保存,则为true

public Data(String filename,String content){

this.filename=filename;

this.content=content;

this.changed=true;

}

//修改数据内容

public synchronized void change(String newContent){

content=newContent;

changed=true;

}

//若数据内容修改过,则保存到文件中

public synchronized void save() throws IOException{

if(!changedofsiK){

return;

}

doSave();

changed=false;

}

//将数据保存到文件中

private void doSave() throws IOException {

// TODO Auto-generated method stub

StdOut.println(Thread.currentThread().getName()+" calls doSave,content= "+content);

Writer writer=new FileWriter(filename);

writer.write(content);

writer.close();

}

}

修改内容的线程类

public class WriterThread extends Thread {

private final Data data;

private final Random random=new Random();

public WriterThread(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 (InterruptedException | IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

定时保存数据的线程类

public class SaverThread extends Thread {

private final Data data;

public SaverThread(String name,Data data){

super(name);

this.data=data;

}

public void run(){

try {

while(true){

data.save();//保存数据

Thread.sleep(1000);//休眠约1秒

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

启动线程的类

public class Main {

public static void main(String[] args) {

Data data=new Data("data1.txt", "empty");

new WriterThread("ChangerThead",data).start();

new SaverThread("SaverThread", data).start();

}

}

总结


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:四、break和continue。(break一break 意思)
下一篇:七、编码、文件。(编码7开头是哪里的)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~