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

Java FixedThreadPool执行器受某些终止条件限制,java,multithreading,threadpool,executorservice,Java,Multithreading,Threadpool,Executorservice,也许是一个新手问题,但它困扰着我,在一堆简单的教程和文档下,我没有找到我的答案 问题。 在Java中,使用JDK(1.8)中的高级并行模式来实现下一步的最佳方法是什么?N个线程的固定池正在执行相同的预定义任务,直到达到终止条件为止。因此,任务量不是预定义的,条件是外部实时触发器。我们必须急切地对终止做出反应,但不要消耗太多的资源切换上下文并从工作线程中窃取CPU时间。假设我们只有两个四弱物理线程可以在控制线程上花费很多 如果它有帮助的话,当前的想法将在下一个代码中实现,但是动态任务队列,而大部分

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

问题。 在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);
    }
}
试试看{
主循环(代理、执行人、终止条件);
}捕捉(中断异常e){
日志警告(被中断,e);
}最后{
执行者。关机现在();
}
专用静态void mainCycle(可调用代理,
遗嘱执行人,
供应商终止条件
)抛出中断异常{
最终列表runFutureResults=执行者。
invokeAll(Collections.nCopies(parallelagent,agent));
int tasksReserve=基本乘法器;
//根据设计,无检测方法在无条件下进行
而(!terminationCondition.get()){
tasksReserve=addTasksIfNeed(执行者、运行未来结果);
睡眠(1000);
}
}

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

由于只有一个线程在改变该值,所以该标志具有易变性就足够了;执行器中的线程只需要在其更改时可见。

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

由于只有一个线程在改变该值,所以该标志具有易变性就足够了;executor中的线程只需要在其更改时可见。

我不完全理解您的问题,但看起来executor Service/FutureTask或CyclicBarrier就是您要找的对象。@VishalKamat,请您为我指出模糊的细节,解决问题。我不完全理解你的问题,但看起来ExecutorService/FutureTask或CyclicBarrier就是你要找的人。@VishalKamat,请你为我指出模糊的细节,解决问题。谢谢。在每个任务中,我应该引入一个while循环并检查实时条件?对于我来说,没有足够的通用方法,如果没有任何时间,如果有大量的微任务,这些微任务会挂起系统从每个线程检查自身的条件,而且这些代码也不会正确地关闭服务。我关注的是所有这些最佳方法的简洁细节,而不是实现帮助。看来,我花了你的时间,应该详细说明这个问题,对不起,只需要几分钟。@Les这完全取决于你在Runnable中做了什么-如果一个简单的
,如果
,就用它。谢谢。在每个任务中,我应该引入一个while循环并检查实时条件?对于我来说,没有足够的通用方法,如果没有任何时间,如果有大量的微任务,这些微任务会挂起系统从每个线程检查自身的条件,而且这些代码也不会正确地关闭服务。我关注的是所有这些最佳方法的简洁细节,而不是实现帮助。看来,我花了你的时间,应该详细说明这个问题,对不起,只需要几分钟。@Les这完全取决于你在Runnable中做了什么-如果一个简单的
,如果
能完成任务,就用它。