【发布时间】:2020-02-14 03:04:32
【问题描述】:
我正在尝试实施生产者-消费者解决方案。
但我不想使用固定数量的消费者线程。相反,如果我的 eventQueue 已满,我想创建一个新的消费者线程。
我创建了一个 ExecutorService 但由于我只有一个 EventConsumerTask 实例,它只为这个任务创建了一个线程。
LinkedBlockingQueue<String> eventQueue = new LinkedBlockingQueue<>(50);
ExecutorService es = new ThreadPoolExecutor(5, 20, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
es.execute(new EventConsumerTask(eventQueue));
这是我的 EventConsumerTask;
public class EventConsumerTask implements Runnable{
private LinkedBlockingQueue<String> eventQueue;
public EventConsumerTask(LinkedBlockingQueue<String> eventQueue){
this.eventQueue = eventQueue;
}
@Override
public void run() {
while(true) {
try {
String event = eventQueue.take();
System.out.println(event);
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
【问题讨论】:
-
你考虑过cached Thread Pool吗?
-
与xingbin的回答相同的问题,不会添加更多EventConsumerTasks
-
哦,我误解了这个概念。不过,这很愚蠢,为什么要在达到阈值后才开始并发处理任务,而不是让一组线程从单个队列中一个一个地处理单个事件?
-
这可能是相当合理的,但前提是您可以放大和。
-
不,我没有投反对票。
标签: java multithreading