Java多线程调用仅在第一次完成时调用其他

时间:2015-09-22 11:21:16

标签: java multithreading executorservice

ExecutorService executor = Executors.newFixedThreadPool(10);

Runnable firstWorker = new DataComparison(DataComparison.FIRST_THREAD_INSTANCE,args[0], args[1], args[2], runSkey, fic_mis_date,legal_entity, args[6],failover);
executor.execute(firstWorker);

Runnable secondWorker = new DataComparison(DataComparison.SECOND_THREAD_INSTANCE,args[0], args[1], args[2], runSkey, fic_mis_date,legal_entity, args[6],failover);
executor.execute(secondWorker);

Runnable thirdWorker = new DataComparison(DataComparison.THIRD_THREAD_INSTANCE,args[0], args[1], args[2], runSkey, fic_mis_date,legal_entity, args[6],failover);
executor.execute(thirdWorker);

这是我的代码,其中我想仅在第一次完成处理时才调用第二个和第三个线程。我在AwaitTerminationsleep之间感到困惑。请建议。

2 个答案:

答案 0 :(得分:1)

使用Java 8 CompletableFuture,您可以编写

serverNameList

这将在第一个任务完成时启动第二个和第三个任务。

答案 1 :(得分:0)

如果我理解你的问题,使用Guava对期货的支持可能会非常有帮助。 我会参考此article by google来更多地了解ListenableFuture。以下是基于您的代码的代码示例,但如果您计划使用Guava的Futures,我可能会以不同的方式构建我的代码:

    ListeningExecutorService s = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
    Runnable firstWorker = new DataComparison(1);

    final Runnable secondWorker = new DataComparison(2);

    final Runnable thirdWorker = new DataComparison(3);

    ListenableFuture f = s.submit(firstWorker);

    Futures.addCallback(f, new FutureCallback() {
        @Override
        public void onSuccess(Object o) {
            secondWorker.run();
        }

        @Override
        public void onFailure(Throwable throwable) {
        }
    });

    Futures.addCallback(f, new FutureCallback() {
        @Override
        public void onSuccess(Object o) {
            thirdWorker.run();
        }

        @Override
        public void onFailure(Throwable throwable) {
        }
    });

这里发生的是首先我们提交第一个工作人员,然后向其添加2个回调(secondWorkerthirdWorker)。 onSuccess方法将在firstWorker成功完成后调用。如果它抛出异常,则会调用onFailure