content
Balking mode
Balking mode means that if it is not suitable to perform this operation, or if it is unnecessary to perform this operation, stop the operation and return directly.
actual case
Overview of class information:
class name | illustrate |
---|---|
Main.java | general entry for the method |
SaveThread.java | save thread |
Data.java | data |
ChangeThread.java | change thread |
definition
- SaveThread.java
package com.github.houbb.thread.learn.easy.learn.balking;
public class SaveThread extends Thread {
private String name;
private final Data data;
public SaveThread(String name, Data data) {
super(name);
this.data = data;
}
@Override
public void run() {
while(true) {
try {
Thread.sleep(1000);
data.save();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
- Data.java
package com.github.houbb.thread.learn.easy.learn.balking;
public class Data {
/**
* 文件名称
*/
private final String fileName;
/**
* 是否变化标识
*/
private boolean changeFlag;
/**
* 内容
*/
private String content;
public Data(String fileName, String content) {
this.fileName = fileName;
this.content = content;
}
public synchronized void change(final String content) {
this.content = content;
this.changeFlag = true;
}
public synchronized void save() {
//balking 没有变化直接返回
if(!changeFlag) {
return;
}
doSave();
this.changeFlag = false;
}
private void doSave() {
System.out.println(Thread.currentThread().getName() + " calls do save content: "+content+" tO file " + fileName);
}
}
- ChangeThread.java
package com.github.houbb.thread.learn.easy.learn.balking;
import java.util.Random;
public class ChangeThread extends Thread {
private String name;
private final Data data;
public ChangeThread(String name, Data data) {
super(name);
this.data = data;
}
/**
* 固定 1S 保存一次数据
*/
@Override
public void run() {
Random random = new Random(1000L);
while(true) {
try {
int value = random.nextInt(1000);
data.change(String.valueOf(value));
Thread.sleep(value);
data.save();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
test
- Main.java
package com.github.houbb.thread.learn.easy.learn.balking;
public class Main {
public static void main(String[] args) {
Data data = new Data("124.txt", "");
new ChangeThread("CHANGE", data).start();
new SaveThread("SAVE", data).start();
}
}
- Test Results
CHANGE calls do save content: 487 tO file 124.txt
SAVE calls do save content: 935 tO file 124.txt
SAVE calls do save content: 676 tO file 124.txt
CHANGE calls do save content: 124 tO file 124.txt
SAVE calls do save content: 792 tO file 124.txt
CHANGE calls do save content: 349 tO file 124.txt
SAVE calls do save content: 641 tO file 124.txt
Method to realize
UML & Code
UML
The UML diagram is as follows
Code
code address