[英]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
. 我对AwaitTermination
和sleep
感到困惑。 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个回调( secondWorker
和thirdWorker
)。 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.