简体   繁体   English

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

[英]Java Multi Threading Invoke Other only when first is done

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);

this is my code wherein i want to invoke second and third thread only when first has completed processing. 这是我的代码,我仅在第一个完成处理后才想调用第二个和第三个线程。 I am confused between AwaitTermination and sleep . 我对AwaitTerminationsleep感到困惑。 Kindly suggest. 请提示。

With Java 8 CompletableFuture you can write 使用Java 8 CompletableFuture,您可以编写

 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);


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


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

 CompletableFuture firstTask = CompletableFuture.runAsync(firstWorker,
          executor);
 firstTask.thenRunAsync(secondWorker,executor)
 firstTask.thenRunAsync(thirdWorker,executor);

This will start the second and third tasks when the first completes. 当第一个任务完成时,这将启动第二个任务和第三个任务。

If I understand your question correctly, using Guava's support for futures might be really helpful. 如果我正确理解了您的问题,那么使用番石榴的期货支持可能会很有帮助。 I would refer to this article by google to learn a little bit more about ListenableFuture . 我会参考Google的这篇文章,以了解有关ListenableFuture更多信息。 Here is a code sample based on your code, though if you do plan to use Guava's Futures, I would probably build my code a bit differently: 这是一个基于您的代码的代码示例,尽管如果您打算使用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) {
        }
    });

What happens here is that first we submit the first worker, and then add 2 callbacks to it ( secondWorker and thirdWorker ). 这里发生的情况是,首先我们提交了第一个worker,然后向其添加了2个回调( secondWorkerthirdWorker )。 The onSuccess method will be called once firstWorker completes successfully. 一旦firstWorker成功完成,将调用onSuccess方法。 If it throws an exception, onFailure will be called. 如果抛出异常,则将调用onFailure

Here's a simple possibility. 这是一个简单的可能性。 There are other more complicated things that you could do, but if I understand your question correctly, this should do what you want: 您还可以执行其他更复杂的操作,但是如果我正确理解了您的问题,则应该执行您想要的操作:

final Runnable firstWorker = new DataComparison(DataComparison.FIRST_THREAD_INSTANCE,args[0], args[1], args[2], runSkey, fic_mis_date,legal_entity, args[6],failover);
final Runnable secondWorker = new DataComparison(DataComparison.SECOND_THREAD_INSTANCE,args[0], args[1], args[2], runSkey, fic_mis_date,legal_entity, args[6],failover);
final Runnable thirdWorker = new DataComparison(DataComparison.THIRD_THREAD_INSTANCE,args[0], args[1], args[2], runSkey, fic_mis_date,legal_entity, args[6],failover);

Runnable combined = new Runnable() {
  @Override
  public void run() {
    firstWorker.run();
    executor.execute(secondWorker);
    executor.execute(thirdWorker);
  }
};

executor.execute(combined);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM