簡體   English   中英

可調用項的執行順序不一致

[英]Execution order of callables is not consistent

我在執行可調用對象集的地方有這段代碼,我需要一個集來完成所有工作,然后再觸發下一組。 這段代碼似乎工作正常,但有時下一組代碼會在時間之前開始運行。 怎么了

private void executeSubGraph(QuestExecutionContext ctx, Set<Activity> subGraph, int progressAfterRan) {
    ExecutorService pool = Executors.newFixedThreadPool(16);
    subGraph.forEach(a -> {
        ActivityRunner<? extends Activity> runner = activityRunnerFactory.getRunner(ctx, a);
        if (runner != null) {
            Callable<List<PortValuePart>> runnerCallable = () -> {
                try {
                    LOG.info("Running {} in {}", a, a.getClass() );
                    List<PortValuePart> result = runner.call();
                    LOG.info("Result of {} in {} is {}", a, a.getClass(), result);
                    if (result != null) {
                        result.forEach(r -> resultProcessor.processResult(new PortValuePartEnvelope(r)));
                    }
                    return result;
                } catch (Exception e) {
                    LOG.warn("Exception for {} in {}", a, runner.getClass(), e);
                    resultProcessor.processResult(Progress.failed(ctx.getId(), e));
                    throw new RuntimeException(e);
                }
            };
            Future<List<PortValuePart>> p = pool.submit(runnerCallable);
        } else {
            LOG.warn("No runner found for activity {}", a);
            resultProcessor.processResult(Progress.failed(ctx.getId(), new RuntimeException("No runner found for activity " + a)));
            throw new RuntimeException("No runner found for activity " + a);
        }
    });

    pool.shutdown();

    try {
        pool.awaitTermination(WAIT_TIME_MILLIS, TimeUnit.MILLISECONDS);
        resultProcessor.processResult(Progress.running(ctx.getId(), progressAfterRan));
    } catch (InterruptedException e) {
        throw new PlatformException("Execution interrupted.");
    }
}

請注意,如果ExecutorService.awaitTermination超時,則不會引發異常。 它只是返回false 如果要確保下一個調用不會與這些調用並發運行,則可能應該使用返回值,並且如果調用時間太長,則可能拋出異常(並殺死任務)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM