首页 文章

Executor Service中的依赖线程 - Java

提问于
浏览
0

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

目前我正在这样做

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 回答

  • 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/

  • 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/

相关问题