我正在处理程序中的多个线程。有一些独立的线程,一些线程取决于其他线程开始执行之前的完成。
目前我正在这样做
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 A
完成执行后才能提交thread B
?还是还有其他更好的方法来管理此类线程?
P.S:thread B
也可能首先提交,但取决于A
,因此它一直在等待直到提交thread 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
}
您可以参考此示例 - http://javahash.com/java-concurrency-future-callable-executor-example/
您可以使用CountDownLatch。
假设您的线程" a"取决于线程" b"。
您需要创建一个倒计时对象初始化到值1(如果线程A仅取决于一个线程)。
在线程B中传递闩锁对象,一旦完成方法的执行(螺纹b)在末尾您可以保留latch.countdown(),该锁定将以1.
来计算闩锁。相同的闩锁对象,您也将传递到线程A。但是在那里您将保持latch.await()为第一行,这意味着您的线程将等到锁存计数为0。
因此,当螺纹b完成后,它将计算闩锁,并将闩锁计数计算为0。它将在latch.await()行之后触发螺纹A中的后续行。基本上,它将触发线程A。
在此处阅读有关锁存的信息:http://howtodoinjava.com/core-java/multi-threading/when-to-cous-countdownlatch-java-java-concurrency-example-tutorigy/