我刚刚意识到 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/