也许,一个新手的问题,但它困扰我,在一堆简单的教程和文档下,我没有找到我的答案。
问题。 什么是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);
}
}
答案 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;
标志是易变的,因为只有一个线程突变该值;执行程序内部的线程只需要查看它何时发生变化。