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

标签 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 尽可能快地拦截新对象。 这是一个好方法吗?

最佳答案

你太努力了。

如果没有任何内容可读取,阻塞队列就会阻塞。因此,如果没有命令,命令线程将简单地暂停并等待发出下一个命令。

您的 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));
    }       
}

关于java - 从 ExecutorService 访问队列 (LinkedBlockingQueue) 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21917461/

相关文章:

c# - 同步事件

java - 构造器字节码

java编译的类包含美元符号

python - 我怎样才能优雅地组织这个多线程Python代码呢?

Java并发: How to select and configure Executors

concurrency - 如何在 Jmeter 中发送并发请求

Java:从 Java 运行批处理脚本时检测用户提示

java - 分发使用 JRI 和 R 的 Java 应用程序

c++ - 具有共享资源的 D3DX11SaveTextureToFile

C++ Boost::ASIO 线程池问题