2016-12-29 22 views
0

我正在处理程序中的多个线程。有一些独立的线程,一些线程在开始执行之前依赖于其他线程的完成。Executor服务中的依赖线程 - Java

目前,如果它所依赖的仍然是运行的线程,然后等待它的完成我在做这个

for (final String inElementId : inElements) 
{ 
    Thread thread = threadsMap.get(inElementId); 
    if ((thread != null) && thread.interrupted()) 
    { 
     Thread.currentThread().interrupt(); 
     throw new RuntimeException(); 
    } else { 
     thread.join(); 
    } 
} 

因此,每个线程检查。

我想编写一个执行程序服务来以系统的方式管理线程。 但我找不到可以检查依赖项的方法。

如何使用线程池执行程序服务执行此操作,thread B只应提交一次thread A已完成执行?或者还有其他更好的方法来管理这些线程吗?

P.S:也可能首先提交thread B,但它取决于A,因此它一直等待,直到thread A被提交并且它完成执行。

+0

我认为是不可能的,而不是检查线程A这样做了,检查其中A是应该做的任务完成与否 – dvsakgec

回答

3

您正在寻找CountDownLatch。

可以说你有线程“A”,依赖于线程“B”。

您需要创建一个CountDownLatch对象,初始化为值1(如果线程A仅依赖于一个线程)。

在线程B通过闩锁对象,一旦完成在你可以保持latch.countDown(),则结束方法的执行(通过方法B线程调用)将由1

倒计时闩锁

您也将传递给线程A的同一个闩锁对象。但是在那里你会保持latch.await()作为第一行,这意味着你的线程A将等待,直到锁存计数变为0.

因此,当线程B完成时,它将倒计数锁存器并使锁存计数为0.在latch.await()行之后,会触发线程A中的后续行。基本上,它会触发线程A

阅读关于倒计时锁在这里:http://howtodoinjava.com/core-java/multi-threading/when-to-use-countdownlatch-java-concurrency-example-tutorial/

2

您还可以使用可调用的实现同样的事情。它返回Future实例,并且可以验证任务是否已完成。

Future future = executorService.submit(new Callable(){ 
public Object call() throws Exception { 
    System.out.println("Asynchronous Callable"); 
    return "Callable Result"; 
}}); 

将这个未来的实例引用添加到线程中作为依赖关系,在执行之前他们会引用是否将来的任务被执行。

if (future.isDone()){ 
    //do something 
} 

您可以参考这个例子 - http://javahash.com/java-concurrency-future-callable-executor-example/