如何用执行器替换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”,并缩短代码/使其更具可读性。