import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
public class ProducerConsumer {
private final static Logger logger = LoggerFactory.getLogger(ProducerConsumer.class);
/**
* 球的容器(原始的)
*/
private static List<String> balls = new ArrayList<>(15);
private static ConcurrentLinkedQueue<String> ballsEx = new ConcurrentLinkedQueue<String>();
/**
* 球的容器(处理过的)
*/
private static List<String> ballsDone = new ArrayList<>(15);
/**
* 通过自定义ThreadFactory设置线程的名称; (便于在调试的时候识别它们)
*/
static class RobotMainThreadFactory implements ThreadFactory {
private AtomicInteger count = new AtomicInteger(0);
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
String threadName = "moveball_" + count.addAndGet(1);
t.setName(threadName);
return t;
}
}
/** 任务线程池 **/
private static ThreadPoolExecutor threadPool = null;
private static void createThreadPool(){
int maximumPoolSize = 5;
threadPool = new ThreadPoolExecutor(maximumPoolSize, maximumPoolSize, 24L,
TimeUnit.HOURS, new ArrayBlockingQueue<Runnable>(maximumPoolSize + 2),
new RobotMainThreadFactory());
RejectedExecutionHandler handler = new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
logger.error("主线程池已满, 无法添加任务: " + r.toString());
}
};
threadPool.setRejectedExecutionHandler(handler);
logger.info("成功创建线程池 robotMainThreadPool.");
}
public static void main(String[] args) throws InterruptedException {
balls.add("aa");
balls.add("bb");
balls.add("cc");
balls.add("dd");
balls.add("ee");
balls.add("ff");
balls.add("gg");
balls.add("hh");
balls.add("ii");
createThreadPool();
for(int i=0; i <= 4; i++) {
Runnable task = new Runnable() {
@Override
public void run() {
while (balls.size() != 0) {
String oneBall = "";
ballsEx.poll();
synchronized (balls) {
oneBall = balls.get(0);
balls.remove(0);
}
if(oneBall.length() == 0) {
break;
}
logger.info("我在搬运小球:" + oneBall);
synchronized (ballsDone) {
ballsDone.add(oneBall);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
threadPool.execute(task);
}
Thread.sleep(5000);
System.out.println(balls.size() + " , " + ballsDone.size());
}
}