我刚刚意识到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
拦截新对象尽可能快。 这是一个好方法吗?
答案 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))”。