【问题标题】:Dependent threads in Executor Service - Java执行器服务中的依赖线程 - Java
【发布时间】:2017-05-13 11:03:55
【问题描述】:

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

目前我正在这样做

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

【问题讨论】:

  • 我认为不是检查线程A是否完成,而是检查A应该做的任务是否完成是不可能的

标签: java multithreading executorservice threadpoolexecutor


【解决方案1】:

您也可以使用 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/

【讨论】:

    【解决方案2】:

    您可以使用 CountDownLatch。

    假设您有依赖于线程“B”的线程“A”。

    您需要创建一个 CountDownLatch 对象初始化为值 1(如果线程 A 仅依赖于一个线程)。

    在线程B中传递latch对象,一旦你在最后完成了方法(线程B调用的方法)的执行,你可以保留latch.countDown(),它会将latch倒计时1。

    您也将传递给线程 A 的相同闩锁对象。但是你将把latch.await()作为第一行,这意味着你的线程A会等到latch count变为0。

    因此,当您的线程 B 完成时,它将倒计时锁存器并使锁存器计数为 0。这将触发线程 A 中的后续行,在 latch.await() 行之后。基本上会触发线程A。

    在此处阅读有关倒计时锁存器的信息:http://howtodoinjava.com/core-java/multi-threading/when-to-use-countdownlatch-java-concurrency-example-tutorial/

    【讨论】:

      猜你喜欢
      • 2020-05-18
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多