executor服务中的因线程-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 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/

最新更新