今天看了下《并发编程实战》,觉得日志服务的生产消费者demo挺有趣的,故自己实现了下;
Bad Way
以下为第一种,较差的实现方式
package hpsyche.log;
import org.junit.Test;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
/**
* @author Hpsyche
*/
public class BadLogWriter {
private final BlockingQueue<String> queue;
private final LoggerThread logger;
private final static int CAPACITY = 3;
public BadLogWriter() {
this.queue = new LinkedBlockingQueue<String>(CAPACITY);
this.logger = new LoggerThread();
}
public void start() {
if (!logger.isAlive()) {
logger.start();
}
}
public void log(String msg) throws InterruptedException {
System.out.println(msg);
queue.put(msg.split(":")[1]);
}
public void shutdown() {
logger.interrupt();
}
private class LoggerThread extends Thread {
@Override
public void run() {
try {
while (true) {
System.out.println("取出日志:" + queue.take());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Test
public void test() {
BadLogWriter log = new BadLogWriter();
log.start();
int i = 1;
try {
while (true) {
Thread.currentThread().sleep(2000);
log.log("队列加入日志:" + (i++));
if (i == 3) {
log.shutdown();
}