线程之旅--Balking Pattern Producer

原创 2007年10月08日 22:17:00

假设有自动保存这种功能,当保存数据时,之前的数据会被覆盖,而只有最新的数据会被存下来,那么相同的数据保存,那么这就是保存的操作就是多余了的,那么以下这个范例将类似于word的自动保存功能,只是此范例为最最精简版

此范例由4个文件组成

Main.java--程序调用类

public class Main {
    public static void main(String[] args) {
        Data data = new Data("data.txt", "(empty)");
        new ChangerThread("ChangerThread", data).start();
        new SaverThread("SaverThread", data).start();
    }
}

Data.java--可修改、可保存数据的类

import java.io.IOException;
import java.io.FileWriter;
import java.io.Writer;

public class Data {
  
    private 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) {                                          
            System.out.println(Thread.currentThread().getName() + " balks");
            return;                                            
        }                                                      
        doSave();                                            
        changed = false;                                         
    }                                                          

    // 实际资料储存到挡案里用的方法
    private void doSave() throws IOException {
        System.out.println(Thread.currentThread().getName() + " calls doSave, content = " + content);
        Writer writer = new FileWriter(filename);
        writer.write(content);
        writer.close();
    }
}

ChanagerThread.java   ---用来修改保存数据属性的类

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

ServerThread.java--定期保存数据属性的类

import java.io.IOException;

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);     // 休息约1秒
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

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

Balking Pattern 与 Guarded Suspension Pattern 都需要警戒条件,只不过Balking Pattern中,当警戒条件不成立时,不进行wait,直接中断。 Bal...
  • dyllove98
  • dyllove98
  • 2013-02-28 12:37:19
  • 1645

Java线程之Guarded Suspension Pattern和Balking Pattern

 Guarded Suspension Pattern的参与者: GuardedObject参与者GuardedObject参与者是一个拥有被防卫的方法(guardedMethod)的类。在guard...
  • derekjiang
  • derekjiang
  • 2009-10-23 16:33:00
  • 1260

Balking Pattern

Balking Pattern
  • qq_35580883
  • qq_35580883
  • 2017-11-27 23:49:18
  • 108

多线程设计模式之——Producer-Consumer Pattern

此模式是在生产者与消费者之间加入一个“桥梁参与者”来缓冲线程之间的处理速度差。一般可以存在多个生产者与消费者,但当双方都只有一个的时候,又称为Pipe Pattern。 例子:假设有2个生产者,2个消...
  • dyllove98
  • dyllove98
  • 2013-02-28 12:36:19
  • 1040

多线程的Producer/Consumer模式

Win32下多线程实现数据协同主要靠下面四种Synchronization Object: eventmutex or critical sectionsemaphorewaitable...
  • u010153703
  • u010153703
  • 2014-08-11 17:46:34
  • 947

设计模式 Concurrency 之 Balking 慢行模式

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

java多线程设计模式--Balking不需要就算了

一、问题: 一个线程要去执行某个操作。但是,在发现这个操作已经被别的线程做了,于是,就没有必要再去做这样的一个操作了。面对这种问题的设计方案是多线程设计模式中的Balking模式。 二、Balki...
  • huangxun08
  • huangxun08
  • 2015-07-28 17:24:24
  • 142

Kafka源码分析之KafkaProducer

KafkaProducer是一个Kafka客户端实现,可以发布记录records至Kafka集群。KafkaProducer是线程安全的,多线程之间共享单独一个producer实例通常会比多个prod...
  • lipeng_bigdata
  • lipeng_bigdata
  • 2016-04-11 16:45:13
  • 2096

线程之旅--Guarded Suspension Pattern

在家换衣服时,突然门铃响了,原来邮递员送快递了。因为衣服不能换了一半就出去,所以对邮递员将,请您稍等。在把门打开,说“让您久等了”,Guarded Suspension Pattern 就是适合这种情...
  • alajl
  • alajl
  • 2007-10-08 22:01:00
  • 1598

linux下C语言实现多线程通信—环形缓冲区,可用于生产者(producer)/消费者(consumer)

操作系统:ubuntu10.04 前言:     在嵌入式开发中,只要是带操作系统的,在其上开发产品应用,基本都需要用到多线程。     为了提高效率,尽可能的提高并发率。因此,线程之间的通...
  • mrwangwang
  • mrwangwang
  • 2014-05-28 11:39:36
  • 2051
收藏助手
不良信息举报
您举报文章:线程之旅--Balking Pattern Producer
举报原因:
原因补充:

(最多只允许输入30个字)