以前我有一个带有无限循环的线程,不断从队列中取出元素:
public void start() {
new Thread(task(), "Publish").start();
}
@SuppressWarnings("InfiniteLoopStatement")
private Runnable task() {
return () -> {
while (true) {
someMethodThatTakesFromAQueue();
}
};
}
现在我想使用ExecutorService,到目前为止我提出的最好的是
public void start() {
Executors.newScheduledThreadPool(1)
.scheduleWithFixedDelay(
this::someMethodThatTakesFromAQueue, 0, 1, TimeUnit.MICROSECONDS);
}
但是我不喜欢这样的事实:我必须在执行之间给出一个非零延迟,实际上我只是希望它永远立即执行,因为队列上的占用会阻塞直到队列中有一个作业处理。
还有其他选择吗?
答案 0 :(得分:0)
Threre是其他threadpools available,例如固定的线程池(newFixedThreadPool
),它似乎与你使用的一样,只是没有sceduling。
答案 1 :(得分:0)
为什么首先需要ExecutionService,因为你只是在运行任务中阻塞,重用线程没有好处,只是创建和维护ExecutionService的额外开销,这就变成了昂贵的单线程。
如果你想有意义地使用ExecutionService,而不是while(true)循环,你可以将新任务添加到ExecutionService,它执行你需要的工作单元。为了提高性能,你可以增加ExecutionService线程池的大小,这样就可以并行运行2个任务,或者在其他地方重用这个ExecutionService,否则请继续使用你编写的Thread实现。