Executor Service中的从属线程 - Java

时间:2016-12-29 06:30:45

标签: java multithreading executorservice threadpoolexecutor

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

目前我正在这样做

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并完成执行。

2 个答案:

答案 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/