[英]Best Queue Consumer implementation in Java
美好的一天!
我想让ExecutorService使用者从队列中获取数据并在服务器端使用它。 这个想法是-我不时轮询队列,如果我发现队列不为空,则使用N个线程(让我说5个)启动ExecutorService。 然后我w8而队列将为空并关闭线程。 再说一遍-轮询队列中的数据...。 还是可能有一些准备就绪的实现/框架来完成此类任务?
我发现了ConcurrentQueue cunsumers的此实现:
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...");
}
}
并以这种方式进行测试:
Queue<String> queue = new ConcurrentLinkedQueue<String>();
ExecutorService consumers = null;
while(true) {
if(queue.size() != 0) {
consumers = Executors.newFixedThreadPool(100);
for (int i = 0; i < 5; i++) {
ConcurrentQueueClient client = new ConcurrentQueueClient(queue);
consumers.execute(client);
}
}
while (queue.size() != 0) {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
consumers.shutdown();
try {
consumers.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
重来。 将字符串包装成可调用或可运行的字符串,然后将它们排队到执行程序服务中。
如果您要处理的数据有限,那么可以像以前一样让主线程调用consumer.shutdown()和consumer.awaitTermination(...),但是没有睡眠循环。 如果您要从队列中无限期地进行处理,则在服务停止之前,不执行shutdown()。
如果没有有限的阻塞队列(什么也不会阻塞queue.put()),您也会遇到内存问题。 可以在创建时将ArrayBlockingQueue赋予执行者服务(请参阅ThreadPoolExecutor(...))
执行器服务的线程正在按照设计检查(queue.take())任务队列。 尝试避免轮询,这会浪费CPU。 始终尝试在reentrantlocks的条件下等待/通知(或等待/发出信号)(执行程序服务代码中的所有内容都由您来处理)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.