如何用执行器替换Java中的无限循环?
以前我有一个无限循环的线程,不断地从队列中删除元素:如何用执行器替换Java中的无限循环?,java,infinite-loop,executorservice,Java,Infinite Loop,Executorservice,以前我有一个无限循环的线程,不断地从队列中删除元素: public void start() { new Thread(task(), "Publish").start(); } @SuppressWarnings("InfiniteLoopStatement") private Runnable task() { return () -> { while (true) { someMethodThatTakesFromAQueue
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);
}
但我不喜欢这样一个事实,我必须在执行之间提供非零延迟,而实际上我只希望它永远立即执行,因为队列上的接管将阻塞,直到队列上有作业要处理
有其他选择吗?有其他选择,例如fixed threadpool newFixedThreadPool,它的行为似乎与您使用的一样,只是没有权杖。为什么您首先需要ExecutionService,因为您只是在运行任务中阻塞,所以重用线程没有任何好处,仅仅是创建和维护ExecutionService的额外开销,这就变成了昂贵的单线程
如果您想有意义地使用ExecutionService,而不是whiletrue循环,您可以只向ExecutionService添加新任务,它完成您需要的工作单元。然后,为了提高性能,您可以增加ExecutionService线程池的大小,以便两个任务并行运行,或者在其他地方重用此ExecutionService,否则请继续使用您编写的线程实现。您可以使用生产者-消费者模型。当和要处理数据时,您可以使用多线程。主要是我希望避免编写感觉难看的“while true”,并缩短代码/使其更具可读性。