Executor服务中的依赖线程-Java

Executor服务中的依赖线程-Java,java,multithreading,executorservice,threadpoolexecutor,Java,Multithreading,Executorservice,Threadpoolexecutor,我在程序中处理多个线程。有一些独立的线程,一些线程在开始执行之前依赖于其他线程的完成 目前我正在做这件事 for ( final String inElementId : inElements ) { Thread thread = threadsMap.get( inElementId ); if ( ( thread != null ) && thread.interrupted() ) { Thread.currentThread

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

目前我正在做这件事

for ( final String inElementId : inElements ) 
{
    Thread thread = threadsMap.get( inElementId );
    if ( ( thread != null ) && thread.interrupted() ) 
    {
        Thread.currentThread().interrupt();
        throw new RuntimeException();
    } else {
        thread.join();
    }
}
因此,每个线程检查它所依赖的线程是否仍在运行,然后等待其完成

我想编写一个executor服务来系统地管理线程。 但是我找不到一种可以检查依赖关系的方法

我如何使用线程池执行器服务来实现这一点,该服务只应在
线程a
完成执行后提交
线程B
?或者有没有其他更好的方法来管理这些线程


提示:也有可能先提交
线程B
,但它取决于
A
,因此它会一直等待
线程A
提交并完成执行。

您可以使用CountDownLatch

假设您有线程“A”,它依赖于线程“B”

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

在线程B中,传递闩锁对象,完成方法(线程B调用的方法)的执行后,可以保留lack.countDown(),它将闩锁倒计时1

同样的闩锁对象也将传递给线程A。但在这里,您将保留lack.await()作为第一行,这意味着您的线程A将等待,直到闩锁计数变为0

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


阅读有关倒计时闩锁的内容:

您可以使用倒计时闩锁

假设您有线程“A”,它依赖于线程“B”

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

在线程B中,传递闩锁对象,完成方法(线程B调用的方法)的执行后,可以保留lack.countDown(),它将闩锁倒计时1

同样的闩锁对象也将传递给线程A。但在这里,您将保留lack.await()作为第一行,这意味着您的线程A将等待,直到闩锁计数变为0

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


阅读这里的倒计时闩锁:

您也可以使用callable实现同样的功能。它返回将来的实例,您可以使用该实例验证任务是否已完成

Future future = executorService.submit(new Callable(){
public Object call() throws Exception {
    System.out.println("Asynchronous Callable");
    return "Callable Result";
}});
在线程中添加这个未来实例引用作为依赖项,在执行之前,它们将引用未来任务是否执行

if (future.isDone()){
  //do something
}
您可以参考此示例-
您也可以使用callable实现同样的功能。它返回将来的实例,您可以使用该实例验证任务是否已完成

Future future = executorService.submit(new Callable(){
public Object call() throws Exception {
    System.out.println("Asynchronous Callable");
    return "Callable Result";
}});
在线程中添加这个未来实例引用作为依赖项,在执行之前,它们将引用未来任务是否执行

if (future.isDone()){
  //do something
}
您可以参考此示例-

我认为不可能不检查线程A是否已完成,而是检查A应该执行的任务是否已完成。我认为不可能不检查线程A是否已完成,而是检查A应该执行的任务是否已完成