繁体   English   中英

Executor服务中的从属线程-Java

[英]Dependent threads in Executor Service - 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完成执行后才应提交? 还是有其他更好的方法来管理此类线程?

PS:也有可能首先提交thread B ,但是它依赖于A因此它将一直等待直到提交thread A并完成执行。

您可以使用CountDownLatch。

假设您有依赖于线程“ B”的线程“ A”。

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

在线程B中传递锁存器对象,并在最后完成方法(由线程B调用的方法)的执行后,可以保留latch.countDown(),它将使锁存器递减1。

您还将传递给线程A的同一闩锁对象。 但是,您将把latch.await()保留为第一行,这意味着您的线程A将一直等到闩锁计数变为0。

因此,线程B完成后,它将对锁存器进行递减计数,并使锁存器计数为0。这将触发在线程A的下一行,在闩锁.await()之后。 基本上,它将触发线程A。

在此处阅读有关倒数锁存器: http : //howtodoinjava.com/core-java/multi-threading/when-to-use-countdownlatch-java-concurrency-example-tutorial/

您也可以使用callable实现相同的目的。 它返回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/

暂无
暂无

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

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