关闭

[置顶] Java多线程模式-Balking模式

标签: java多线程java多线程
166人阅读 评论(0) 收藏 举报
分类:

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(!changed){
            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();
    }
}

说明:学习《图解java多线程设计模式》的学习笔记整理和自己的理解。

更多技术干货,请关注下面二维码:
这里写图片描述

0
0
查看评论

多线程设计模式之——Balking Pattern

Balking Pattern 与 Guarded Suspension Pattern 都需要警戒条件,只不过Balking Pattern中,当警戒条件不成立时,不进行wait,直接中断。 Balking Pattern的适用性: 1.不需要刻意执行的时候,balk可以提高性...
  • dyllove98
  • dyllove98
  • 2013-02-28 12:37
  • 1550

设计模式 Concurrency 之 Balking 慢行模式

定义 例子1.定义当现在不适合这个操作,或者没有必要进行这个操作时,就直接放弃而回去 2.例子WashinMachineStatepackage com.hqq.concurrency.balking;/** * WashingMachineState * Created by heqianqi...
  • Thousa_Ho
  • Thousa_Ho
  • 2017-08-09 09:20
  • 165

JAVA多线程模式之Balking

当现在不适合这个操作,或是没有必要进行这个操作时就直接放弃这个操作而回去。这个就是Balking模式 例如王某在餐厅吃饭,当王某需要点餐时喊服务员需要点餐。当服务员A和B都注意到了王某点餐的示意,这时服务员B看到服务员A已经去响应了王某的点餐请求,所以服务员B就不会再过去响应王某的点餐请求。...
  • qq7342272
  • qq7342272
  • 2011-10-27 11:30
  • 1122

Java多线程设计模式-学习笔记-Balking模式.

1. 该模式的形象描述:            不需要的话,就算了吧.         Balk的含义:退缩不前.2. 模式描述: ...
  • doudou_bb_08
  • doudou_bb_08
  • 2008-04-25 16:32
  • 575

JAVA多线程模式之Balking 总结!

当现在不适合这个操作,或是没有必要进行这个操作时就直接放弃这个操作而回去。这个就是Balking模式例如王某在餐厅吃饭,当王某需要点餐时喊服务员需要点餐。当服务员A和B都注意到了王某点餐的示意,这时服务员B看到服务员A已经去响应了王某的点餐请求,所以服务员B就不会再过去响应王某的点餐请求。   程...
  • u012944590
  • u012944590
  • 2013-11-24 23:52
  • 237

Balking Patten ------Java 多线程模式(四)

                         ...
  • xingqisan
  • xingqisan
  • 2009-03-02 14:07
  • 396

JAVA多线程(三)生产者消费者模式及实现方法

介绍了生产者消费者模式以及实现方法(wait&notify,阻塞队列
  • antony9118
  • antony9118
  • 2016-05-23 15:15
  • 2654

java多线程之Balking模式

一、Balking模式 如果现在不适合执行这个操作,或者没有必要执行这个操作,就停止处理,直接返回--这就是Balking模式。所谓Balk,就是停止并返回的意思。 Balking模式与Guarded Suspension模式一样,也存在守护条件,在Balking模式中,如果守护条件不成立,则立...
  • smartdt
  • smartdt
  • 2018-02-01 09:21
  • 107

关于java多线程浅析一:简单实现生产消费模式

关于什么是线程,这里就不过多介绍了。但为什么要用多线程呢?原因无他,就是希望更好的利用CPU资源。当然,多线程在模拟很多实际场景下,也是一把利器,就比如生产-消费模式,使用不同的线程来充当生产者和消费者,就很容易实现一个简单的生产-消费模型。说到此,那我们就先利用线程中的wait()和notifyA...
  • zhangjunfei12103323
  • zhangjunfei12103323
  • 2017-05-11 15:01
  • 1146

CSDN技术中心 java多线程设计模式 [强烈推荐]

 java多线程设计模式 java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程。Thre...
  • liulian720
  • liulian720
  • 2006-03-27 10:40
  • 1467
    个人资料
    • 访问:37144次
    • 积分:879
    • 等级:
    • 排名:千里之外
    • 原创:53篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    最新评论