繁体   English   中英

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

[英]FixedThreadPool executor limited by some termination condition

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

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

如果有帮助,当前的想法将在下一个代码中实现,但是动态任务会排队,而大多数睡眠控制周期对我来说还不够巧妙。

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

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

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

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

// set your flag
done = true;

因为只有一个线程正在修改该值,所以该标志是可变的就足够了; 执行器内部的线程只需要了解它何时更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM