我正在处理程序中的多个线程。有一些独立的线程,一些线程在开始执行之前依赖于其他线程的完成。
目前我正在这样做
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
完成执行后提交?或者还有其他更好的方法来管理这样的线程吗?
P.S:首先提交thread B
也是可能的,但这取决于A
所以它会一直等到提交thread A
并完成执行。
答案 0 :(得分:3)
您可以使用CountDownLatch。
假设你有线程“A”依赖于线程“B”。
您需要创建一个初始化为值1的CountDownLatch对象(如果线程A仅依赖于一个线程)。
在线程B中传递latch对象,一旦你完成方法的执行(线程B调用的方法),你可以保留latch.countDown(),它会将锁存器倒数1。
您将传递给线程A的相同锁存对象。但是你会将latch.await()保留为第一行,这意味着你的线程A将等待,直到锁存计数变为0。
因此,当线程B完成时,它将对锁存器进行倒计时并使锁存计数为0.这将在latch.await()行之后触发线程A中的后续行。基本上,它会触发线程A。
在此处阅读关于倒计时锁定:http://howtodoinjava.com/core-java/multi-threading/when-to-use-countdownlatch-java-concurrency-example-tutorial/
答案 1 :(得分:3)
您也可以使用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/