java多线程设计模式之文件保存
Java实现多线程保存文件:两线程去保存文件,一个保存线程定时去保存文件,一个修改线程去修改文件,随机停贷后再去保存文件,如果其中一个线程已经保存过文件了,那么另一个线程来保存文件的时候就不需要保存了。
这里的保存摸拟为内容写人文件中。
类设计如下:
Data:数据类用于存储文件内容信息的类,提供修改文件内容和保存内容的方法。
SaveThread:保存线程类定时保存调用数据类的保存方法去保存文件。
ChangeThread:修改线程类不断调用数据类的修改方法修改文件,并保存。
Mian:执行入口。
实现如下:
Data:数据类
package com.blak.thread;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
/**
*
* @author Administrator
*文件数据类
*/
public class Data {
private final String fileName;//文件名
private String content; //文件内容
private boolean changed; //标志文件是否被修改
public Data(String name, String content){
this.fileName = name;
this.content = content;
this.changed = true;
}
/**
* 修改文件内容,并将修改标志值为true
* @param content
*/
public synchronized void change(String content){
this.content = content;
changed = true;
}
/**
* 保存文件数据,即将数据内容写入到文件中去保存,并将修改标志值为false
* @throws IOException
*/
public synchronized void save()throws IOException{
if(!changed)return;
doSave(); //执行保存
changed = false;
}
/**
* 将文件内容写入文件中保存
* @throws IOException
*/
public void doSave() throws IOException{
Writer writer = new FileWriter(fileName);
writer.write(content);
writer.close();
System.out.println(Thread.currentThread().getName()+" doSave content="+content);
}
}
SaveThread:保存数据线程类
package com.blak.thread;
import java.io.IOException;
/**
* 保存线程定时保存文件数据
* @author Administrator
*
*/
public class SaveThread extends Thread{
private Data data;
public SaveThread(Data data){
super("SaveThread");
this.data = data;
}
/**
* 保存线程每隔一秒检查保存文件一次
*/
public void run(){
while(true){
try {
data.save();
Thread.sleep(1000);//休息1秒
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
ChangeThread:修改数据线程类
package com.blak.thread;
import java.io.IOException;
import java.util.Random;
/**
* 修改文件线程,修改将文件保存
* @author Administrator
*
*/
public class ChangeThread extends Thread{
private Data data;
private Random random = new Random();
public ChangeThread(Data data){
super("ChangeThread");
this.data = data;
}
/**
* 修改文件
*/
public void run(){
try {
for (int i = 0; i < 10; i++) {
data.change("content."+i);
Thread.sleep(random.nextInt(1000));//摸拟线程去执行其他任务
data.save();
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Main:main执行入口
package com.blak.thread;
public class Main {
/**
* 指定文件,启动保存线程和修改线程
* @param args
*/
public static void main(String[] args) {
Data data = new Data("d:/data.txt", "test");
new SaveThread(data).start();
new ChangeThread(data).start();
}
}
执行结果为:
SaveThread doSave content=test
ChangeThread doSave content=content.0
SaveThread doSave content=content.1
ChangeThread doSave content=content.2
ChangeThread doSave content=content.3
SaveThread doSave content=content.4
ChangeThread doSave content=content.5
SaveThread doSave content=content.6
ChangeThread doSave content=content.7
SaveThread doSave content=content.8
SaveThread doSave content=content.9