[英]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.