从ExecutorService访问队列(LinkedBlockingQueue)的正确方法

时间:2014-02-20 19:20:31

标签: java multithreading concurrency threadpool blockingqueue

我刚刚意识到LinkedBlockingQueue在我的情况下是一个很好的解决方案 - 我有一个不时填充的队列(但在非常短时间间隔内)。我希望我的ExecutorService能够检查出现在此队列中的任何对象。

我不确定现在LinkedBlockingQueue的正确用法是什么。早些时候,我的代码看起来像:

public void launch(){

    ListeningExecutorService pool = 
            MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(threadNumber));

    while(true){
        if(!commandsQueue.isEmpty()){
            final ListenableFuture<String> future = pool.submit(new CommandWorker(commandsQueue.poll()));
            // [...]  
        }           
    }       
}

我在想......似乎:

public void launch(){
            ListeningExecutorService pool = 
            MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(threadNumber));

    while(true){
        Command newCommand = commandsQueue.take(); 
        final ListenableFuture<String> future = pool.submit(new CommandWorker(newCommand));
            // [...]  

    }       
}

目的是让我的ListeningExecutorService 拦截新对象尽可能快。 这是一个好方法吗?

2 个答案:

答案 0 :(得分:2)

你工作太辛苦了。

阻塞队列BLOCKS,如果没有东西要读。因此,如果没有命令,命令线程将暂停并等待下一个命令被发出。

您的take命令会弹出队列中的第一个项目。如果没有第一项,则线程暂停。 if语句是不必要的。

public void launch(){
        ListeningExecutorService pool = 
        MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(threadNumber));

    while(true){
        Command newCommand = commandsQueue.take(); 
        final ListenableFuture<String> future = pool.submit(new CommandWorker(newCommand));
    }       
}

答案 1 :(得分:2)

为什么要使用队列?而不是“commandsQueue.put(command)”,直接执行“pool.submit(new CommandWorker(command))”。