【问题标题】:FixedThreadPool executor limited by some termination conditionFixedThreadPool 执行器受某些终止条件限制
【发布时间】:2016-05-22 00:57:06
【问题描述】:

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

问题。 在 Java 中,使用 JDK(1.8) 中的高级并行模式来实现下一个的最佳方式是什么? 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);
    }
}

【问题讨论】:

  • 我不完全理解你的问题,但看起来 ExecutorService/FutureTask 或 CyclicBarrier 是你要找的。​​span>
  • @VishalKamat,能否请您指出模糊的细节,以便解决问题。

标签: java multithreading threadpool executorservice


【解决方案1】:

要么使用某种协调机制(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;

flag 是 volatile 就足够了,因为只有一个线程在 mutating 值;执行器内部的线程只需要在它发生变化时可见。

【讨论】:

  • 谢谢。在每个任务中,我应该引入一个while循环并检查一个实时条件吗?对我来说没有足够的通用方法,如果没有任何时间,如果有成群的微任务挂起系统检查每个线程本身的条件,那么这段代码也不会正确关闭服务。我是关于最佳方法的所有这些简洁的细节,而不是为了实现帮助。看来,我花了你的时间,应该详细说明这个问题,抱歉,就几分钟。
  • @Les 这完全取决于你在 Runnable 中所做的事情——如果一个简单的 if 能完成这项工作,那就使用它。
猜你喜欢
  • 2020-06-01
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多