java - 如何知道 Runnable 被安排重复执行

标签 java scheduledexecutorservice

我需要运行五个线程每 20 秒重复从 API 获取数据,所以我使用了 ScheduledExecutorService。

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);

for (int i = 0; i < 5; i++) {
    scheduler.scheduleWithFixedDelay(Constant.workerThread[i], 0, delay, TimeUnit.SECONDS);
}

我如何知道(每次)五个线程何时执行?

最佳答案

编辑:看来人们并没有真正理解代码片段的概念。我会把它加粗,这样就不会再有人来找我了,管理内心ExecutorService在外部,不在 Callable 内部lambda,在需要时采取适当的措施有序关闭它

您可以做的是管理一个计划任务,并在该任务中执行您的五个工作人员。

final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);
scheduler.scheduleWithFixedDelay(
        () -> {
            final ExecutorService e = Executors.newFixedThreadPool(5);
            final CompletionService<?> cs = new ExecutorCompletionService<>(e);

            for (int i = 0; i < 5; i++) {
                // Constant.workerThread[i] is a Runnable
                cs.submit(Constant.workerThread[i], null);
            }

            for (int i = 0; i < 5; i++) {
                try {
                    // Will block until a Future<?> result is available.
                    // Doesn't matter which one, it will take the first available.
                    cs.take();
                } catch (final InterruptedException ignored) {
                    // Ingore the exception, as we care only
                    // about if all off them finished (abruptly or not)
                }
            }

            // All of them finished!
            e.shutdown();
        }, 0, 20, TimeUnit.SECONDS));

JavaDoc ExecutorCompletionService

A CompletionService that uses a supplied Executor to execute tasks. This class arranges that submitted tasks are, upon completion, placed on a queue accessible using take.

JavaDoc ExecutorCompletionService#take

Retrieves and removes the Future representing the next completed task, waiting if none are yet present.

这必须改进,但你应该明白了。

关于java - 如何知道 Runnable 被安排重复执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55071972/

相关文章:

java - 将 Optaplanner 与现有 Java 应用程序集成

java - 给定一个数 N,找到最小的偶数 E 使得 E > N

JavaFX 刷新 TableView 线程

javascript - 在ScheduledExecutorService中执行javascript函数?

java - 如何安排任务运行一次?

java - 为什么我们必须从一个小部件更新多个小部件?

java - 基于某些请求属性而不是 Iplanet 服务器中的 session 的粘性

java - 了解 ScheduledThreadPoolExecutor

java - ManagedScheduledExecutorService 任务能否在服务器重启或崩溃后继续存在?

java - 异常处理 ScheduledExecutorService