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应该执行的任务是否已完成