繁体   English   中英

Java最佳队列使用者实现

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM