背景:最近在学习多线程,有一道题目是一个线程不停的向文件中写,写入的内容格式都是一样的。另外一个线程是读线程,实现增量的读取,并进行解析获取所想要的字段。下面是写的小demo,并使用到前面的记忆设计模式
package rememberSet;
public class Scheduler {
/**
*
* @param args
*/
public static void main(String[] args) {
FileWriterScheduler.getIns().setFileName("Desktop/aa");
FileWriterScheduler.getIns().start();
FileReaderScheduler.getIns().start();
}
}
package rememberSet;
/**
*
*/
public class FileTaskDTO {
private String fileName;
private long lastReadBytes;
private long newReadBytes;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public long getLastReadBytes() {
return lastReadBytes;
}
public void setLastReadBytes(long lastReadBytes) {
this.lastReadBytes = lastReadBytes;
}
public long getNewReadBytes() {
return newReadBytes;
}
public void setNewReadBytes(long newReadBytes) {
this.newReadBytes = newReadBytes;
}
}
package rememberSet;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
*
* 文件读取调度中心
*/
public class FileReaderScheduler {
private FileReaderScheduler() {
}
static FileReaderScheduler fileReaderScheduler = new FileReaderScheduler();
public static FileReaderScheduler getIns() {
return fileReaderScheduler;
}
private Thread fileReadThread;
private ReadFileTask readFileTask;
private Queue<FileTaskDTO> queue = new ConcurrentLinkedQueue<FileTaskDTO>();
public void start() {
readFileTask = new ReadFileTask(queue);
fileReadThread = new Thread(readFileTask);
fileReadThread.start();
}
public void submit(FileTaskDTO fileTaskDTO) {
queue.add(fileTaskDTO);
}
}
package rememberSet;
/**
* 文件写入调度中心
*/
public class FileWriterScheduler {
private FileWriterScheduler(){}
private static FileWriterScheduler fileWriterScheduler=new FileWriterScheduler();
public static FileWriterScheduler getIns(){
return fileWriterScheduler;
}
private String fileName;
private Thread writeThread;
private WriterFileTask writerFileTask;
public void start(){
writerFileTask=new WriterFileTask(fileName);
writeThread=new Thread(writerFileTask);
writeThread.start();
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
package rememberSet;
import java.io.UnsupportedEncodingException;
import java.util.Queue;
import java.util.concurrent.TimeUnit;
public class ReadFileTask implements Runnable{
private Queue<FileTaskDTO> queue;
/**
* @param fileName
* @param queue
*/
public ReadFileTask(Queue<FileTaskDTO> queue) {
this.queue = queue;
}
/**
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
while(true){
FileTaskDTO fileTaskDTO=queue.poll();
if(fileTaskDTO==null){
try {
TimeUnit.MILLISECONDS.sleep(3000);
} catch (InterruptedException e) {
}
}else{
readFile(fileTaskDTO);
}
}
}
private void readFile(FileTaskDTO fileTaskDTO){
HistoryStatus historyStatus=HistoryStatusRememberSet.getHistoryStatus(fileTaskDTO.getFileName(), true);
long from=historyStatus.getStart();
long to=historyStatus.getEnd()+fileTaskDTO.getNewReadBytes();
byte[] data=FileUtils.readFile(fileTaskDTO.getFileName(), from, to);
try {
String str=new String(data,"UTF-8");
System.out.println(Thread.currentThread().getName()+"读取:from:"+from+"to:"+to+"--"+str);
} catch (UnsupportedEncodingException e) {
}
historyStatus.setStart(to);
historyStatus.setEnd(to);
}
}
package rememberSet;
public class WriterFileTask implements Runnable{
private String fileName;
/**
* @param fileName
*/
public WriterFileTask(String fileName) {
this.fileName = fileName;
}
/**
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
while(true){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
writerFile(fileName);
}
}
private void writerFile(String fileName){
byte[] data="我爱你中国".getBytes();
String contet=null;
contet = new String(data);
long writerBytes=FileUtils.writerToFile(fileName, contet, "UTF-8");
FileTaskDTO fileTaskDTO=new FileTaskDTO();
fileTaskDTO.setFileName(fileName);
fileTaskDTO.setNewReadBytes(writerBytes);
FileReaderScheduler.getIns().submit(fileTaskDTO);
}
}