Java多线程Balking模式不需要就算了

Balking模式

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

示例程序

Data  表示可以修改并保持数据的类
SaverThread  定期保持数据内容的类
ChangerThread  修改并保存数据内容的类
Main  测试程序行为的类
Data类
import java.io.IOException;
import java.io.FileWriter;
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;
  }

  public synchronized void change(String newContent){
    content = newContent;
    changed = true;
  }

  public synchronized void save() throws IOException {
    if( !changed ){
      return;
    }
    doSave();
    changed = true;
  }

  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();
  }
}
SaverThread类
SaverThread类用于定期保存数据内容
import java.io.IOException;

public class SaverThread extends Thread {
  private final Data data;
  public ServerThread(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();
    }
  }
}
ChangerThread 类
ChangerThread类用于修改数据内容,并执行保存处理。
import java.io.IOException;
import java.util.Random;

public class ChangerThread extends Thread {
  private final Data data;
  private final 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();
    }
  }
}
Main 类
Main类首先创建一个Data实例,然后ChangerThread和SaverThread的实例会共用该实例,分别启动各自的线程。
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();
  }
}

Balking模式中的登场角色

  • GuardedObject(被保护的对象)
    GuardedObject角色是一个拥有被防护的方法(guardedMethod)的类。当线程执行guardedMethod方法时,若守护条件成立,则立即执行处理。而当守护条件不成立时,则不执行实际的处理,直接返回。守护条件的成立与否,会随着GuardedObject角色的状态变化而发生变化。
    除了guardedMethod之外,GuardedObject角色还有可能有其他来改变状态的方法stateChangingMethod。
    在示例程序中,由Data类来扮演此角色,save方法对应的时guardedMethod, change方法对应的则是stateChangingMethod。
    守护条件为"changed字段为true"。

你可能感兴趣的:(Java多线程Balking模式不需要就算了)