Balking 模式

Balking 模式

所谓Balk,就是“停止并返回”的意思,如果现在不适合执行这个操作,或者没有必要执行这个操作,就停止处理,直接返回。

示例程序

我们来看一个使用了Balking模式的简单示例程序。这个程序会定期将当前数据内容写入文件中。
当数据内容被写入时,会完全覆盖上次写入的内容,只有最新的内容才会被保存。
另外,当写入的内容与上次写入的内容完全相同时,再向文件写入就显得多余了,所以就不再执行写入操作。也就是说,该程序以“数据内容存在不同”作为守护条件,如果数据内容相同,则不再执行写入操作,直接返回。

类的一览表

名字 说明
Data 表示可以修改并保存的数据的类
SaveThread 定期保存数据内容的类
ChangeThread 修改并保存数据内容的类
Main 测试程序行为的类

data类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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;
}

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 {
System.out.println(Thread.currentThread().getName() + " calls doSave. content = " + content);
Writer writer = new FileWriter(fileName);
writer.write(content);
writer.close();
}

}

SaveThread类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class SaveThread extends Thread {
private final Data data;

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

ChangeThread类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class ChangeThread extends Thread {
private final Data data;

private final Random random = new Random();

public ChangeThread(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类

1
2
3
4
5
6
7
public class Main {
public static void main(String[] args) {
Data data = new Data("data.txt", "(empty)");
new ChangeThread("ChangeThread", data).start();
new SaveThread("SaveThread", data).start();
}
}
0%