如何用执行程序替换Java中的无限循环?

时间:2014-06-06 13:09:02

标签: java infinite-loop executorservice

以前我有一个带有无限循环的线程,不断从队列中取出元素:

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);
}

但是我不喜欢这样的事实:我必须在执行之间给出一个非零延迟,实际上我只是希望它永远立即执行,因为队列上的占用会阻塞直到队列中有一个作业处理。

还有其他选择吗?

2 个答案:

答案 0 :(得分:0)

Threre是其他threadpools available,例如固定的线程池(newFixedThreadPool),它似乎与你使用的一样,只是没有sceduling。

答案 1 :(得分:0)

为什么首先需要ExecutionService,因为你只是在运行任务中阻塞,重用线程没有好处,只是创建和维护ExecutionService的额外开销,这就变成了昂贵的单线程。

如果你想有意义地使用ExecutionService,而不是while(true)循环,你可以将新任务添加到ExecutionService,它执行你需要的工作单元。为了提高性能,你可以增加ExecutionService线程池的大小,这样就可以并行运行2个任务,或者在其他地方重用这个ExecutionService,否则请继续使用你编写的Thread实现。