FixedThreadPool执行器受某些终止条件的限制

时间:2016-05-21 14:22:10

标签: java multithreading threadpool executorservice

也许,一个新手的问​​题,但它困扰我,在一堆简单的教程和文档下,我没有找到我的答案。

问题。 什么是Java中的最佳方式,使用JDK(1.8)的高级并行模式来实现下一个?固定的N个线程池正在执行相同的预定义任务,直到达到终止条件。因此,任务量不是预定义的,条件是外部实时触发器。我们必须急切地对终止做出反应,但不要消耗太多资源切换上下文并从工作者线程中窃取CPU时间。假设我们只有两到四个弱的物理线程在控制线程上花费很多。

如果它有帮助,当前的想法会在下一个代码中实现,但是dymanic任务会排队,而大多数睡眠控制周期看起来并不适合我。

try {
    mainCycle(agent, executor, terminationCondition);
} catch (InterruptedException e) {
    log.warn(INTERRUPTED_EX, e);
} finally {
    executor.shutdownNow();
}

 private static void mainCycle(Callable<Long> agent,
                                  ExecutorService executor,
                                  Supplier<Boolean> terminationCondition
) throws InterruptedException {

    final List<Future<Long>> runFutureResults = executor.
            invokeAll(Collections.nCopies(parallelAgents, agent));

    int tasksReserve = BASE_MULTIPLIER;
    //noinspection MethodCallInLoopCondition, by design
    while (!terminationCondition.get()) {
        tasksReserve = addTasksIfNeed(executor, runFutureResults);
        Thread.sleep(1000);
    }
}

1 个答案:

答案 0 :(得分:3)

使用某种协调机制(phaser,当你需要动态添加更多作业时,它在Java 7中引入是有用的)或者只是在完成时保留你设置的外部标志:

ExecutorService service = Executors.newFixedThreadPool(N);
volatile boolean done = false;

// add your jobs:
service.submit(() -> {
    while (!done) {
        // do something
    }
});

// set your flag
done = true;

标志是易变的,因为只有一个线程突变该值;执行程序内部的线程只需要查看它何时发生变化。