java多线程设计模式全部源码:
模式图
类图
时序图
Main.java
public class Main {
public static void main(String[] args) {
Data data = new Data("haha.txt", "empty");
new ChangeThread("change thread", data).start();
new AutoSaveThread("save thread", data).start();
}
}
Data.java
import java.io.FileWriter;
import java.io.IOException;
public class Data {
private String mFilename;
private String mContent;
private boolean mChanged;
public Data(String filename, String content) {
this.mFilename = filename;
this.mContent = content;
this.mChanged = true;
}
//修改内容
public synchronized void changeContent(String newContent) {
mContent = newContent;
mChanged = true;
}
//GuardedMethod
//保存内容,ChangeThread和AutoSaveThread都调用次方法
public synchronized void save() throws IOException {
if(!mChanged) {
return;
}
doSave();
mChanged = false;
}
private void doSave() throws IOException {
System.out.println(Thread.currentThread().getName() + " save content:" + mContent);
FileWriter fw = new FileWriter(mFilename);
fw.write(mContent);
fw.close();
}
}
ChangerThread.java
import java.util.Random;
public class ChangeThread extends Thread {
Data mData;
Random mRandom = new Random();
public ChangeThread(String name, Data mData) {
super(name);
this.mData = mData;
}
@Override
public void run() {
for(int i = 0; true; ++i) {
mData.changeContent("no:" + i);
try {
Thread.sleep(mRandom.nextInt(1000));
mData.save();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
AutoSaveThread.java
public class AutoSaveThread extends Thread {
private Data mData;
public AutoSaveThread(String name, Data mData) {
super(name);
this.mData = mData;
}
@Override
public void run() {
while(true) {
try {
mData.save();
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}