Java中的最佳队列使用者实现

时间:2016-02-02 14:42:48

标签: java multithreading

美好的一天!

我想让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...");
    }
 }

1 个答案:

答案 0 :(得分:1)

重新开始。 将字符串换行为可调用或可运行,并将其排入执行程序服务。

如果你有一组有限的数据需要处理,那么主线程就像以前一样调用consumer.shutdown()和consumer.awaitTermination(...),但没有睡眠循环。如果要从队列中无限期地处理,那么在服务完成之前不会关闭()。

如果您没有有限的阻塞队列(没有阻止queue.put()),您也将面临内存问题。可以在创建时将ArrayBlockingQueue赋予执行程序服务(请参阅ThreadPoolExecutor(...))

Executor服务的线程正在按设计对任务队列进行检查(queue.take())。尽量避免轮询,这会浪费CPU。始终尝试等待/通知(或等待/发出信号)来自重入锁定的条件(在执行程序服务代码中全部为您处理)