【问题标题】:How can I replace an infinite loop in Java with an executor?如何用执行程序替换 Java 中的无限循环?
【发布时间】:2014-06-06 13:09:01
【问题描述】:

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

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

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

还有其他选择吗?

【问题讨论】:

  • 你可以使用生产者消费者模型。何时以及何时处理数据,然后您可以使用多线程

标签: java infinite-loop executorservice


【解决方案1】:

还有其他threadpools available,例如固定线程池(newFixedThreadPool),它的行为似乎与您使用的一样,只是没有调度。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 主要是我想避免写 while (true) 这感觉难看,并缩短我的代码/使其更具可读性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2011-01-06
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多