美好的一天!
我想让ExecutorService使用者从队列中获取数据并在服务器端使用它。我的想法是 - 我不时轮询队列,如果我发现它不是空的,我用N个线程启动ExecutorService(比方说5)。然后我w8,而队列将为空并关闭线程。再一次 - 轮询数据排队.... 这个alg好吗?或者可能有一些现成的实现/框架用于此类任务?
我发现了ConcurrentQueue cunsumers的这个实现:
tryAcceptWithActor
以这种方式测试它:
public class ConcurrentQueueClient implements Runnable {
private Queue<String> concurrentQueue;
public ConcurrentQueueClient(Queue concurrentQueue) {
this.concurrentQueue = concurrentQueue;
}
public void run() {
boolean stopCondition = (concurrentQueue.size() == 0);
while (!stopCondition) {
for (int i = 0; i < concurrentQueue.size(); i++) {
System.out.println("Client dequeue item "
+ concurrentQueue.poll());
}
stopCondition = (concurrentQueue.size() == 0);
}
System.out.println("Client thread exiting...");
}
}
答案 0 :(得分:1)
重新开始。 将字符串换行为可调用或可运行,并将其排入执行程序服务。
如果你有一组有限的数据需要处理,那么主线程就像以前一样调用consumer.shutdown()和consumer.awaitTermination(...),但没有睡眠循环。如果要从队列中无限期地处理,那么在服务完成之前不会关闭()。
如果您没有有限的阻塞队列(没有阻止queue.put()),您也将面临内存问题。可以在创建时将ArrayBlockingQueue赋予执行程序服务(请参阅ThreadPoolExecutor(...))
Executor服务的线程正在按设计对任务队列进行检查(queue.take())。尽量避免轮询,这会浪费CPU。始终尝试等待/通知(或等待/发出信号)来自重入锁定的条件(在执行程序服务代码中全部为您处理)