package thread;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
/**
* 一个日志服务的框架
* @author Administrator
*
*/
public class LoggerWriter {
private final BlockingQueue<String>queue;
private final LoggerThread loggerThread;
private final PrintWriter writer;
private boolean isShutdown;
private int reservations;
public LoggerWriter() throws FileNotFoundException{
queue=new LinkedBlockingDeque<String>();
loggerThread=new LoggerThread();
writer=new PrintWriter("");
}
public void start(){
loggerThread.start();
}
public void stop(){
synchronized (this) {
isShutdown=true;
}
loggerThread.interrupt();
}
public void log(String msg) throws InterruptedException{
synchronized (this) {
if(isShutdown)
throw new IllegalStateException();
++reservations;
}
queue.put(msg);
}
private class LoggerThread extends Thread{
public void run(){
try {
while (true) {
try {
synchronized (LoggerWriter.this) {
if(isShutdown&&reservations==0)
break;
}
String msg=queue.take();
synchronized (LoggerWriter.this) {
--reservations;
}
writer.print(msg);
} catch (InterruptedException e) {
}
}
} finally{
writer.close();
}
}
}
}