线程完成通知

时间:2013-11-26 10:34:51

标签: java multithreading

我有很多并发运行的线程。在这几个线程中,执行取决于其他线程的完成。 例如,

  

线程 - 1,线程 - 2,线程 - 3

这些可以独立运行。

  

线程 - 4,取决于1和2的完成

     

线程 - 5,取决于完成1和3

     

线程 - 6,取决于完成1,2和3

所有线程都提交给执行者。线程4,5和6必须在启动之前实现一些等待机制。对于上述情况,java中可用的阻塞机制有哪些。

3 个答案:

答案 0 :(得分:3)

使用

时会收到Future<T>个obejct
Future<?> ExecutorService.submit(Runnable task)

将未来传递给必须等待完成的线程(例如它的构造函数)并执行:

future.get();

将阻止,直到此未来的线程结束。

答案 1 :(得分:2)

使用诸如CountDownLatch或Future之类的阻塞工具的提议可以在无界的Executor上工作,或者至少能够同时启动所有6个线程,否则存在线程饥饿的风险。因此,与没有Executor直接启动所有6个线程相比,使用Executor没有任何优势。

同时,依赖关系规定每个时刻不会运行3个以上的线程。如果线程的实际数量很重要,您应该使用事件驱动的工具而不是阻塞工具。我的意思是收集信号的对象,当来自任务1和2的信号到达时,提交任务4等。从理论的角度来看,这类似于Petri nets。遗憾的是,JDK没有为事件驱动的任务协调提供标准类。从头开始实现这样的信号收集器/任务发射器并不困难,或者您可以使用数据流库df4j

答案 2 :(得分:1)

您可以尝试使用完成作业的线程的 ExecutorService 实现(您希望使用线程完成的任务),您可以尝试调用CountDownLatch类的await()方法,如下所示:

public void finishWork() {
        try {
            System.out.println("START WAITING for thread");
            countDownLatch.await();
            System.out.println("DONE WAITING for thread");
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
    }

要监视每个线程,您可以尝试调用此类中可用的countDown()方法。因此,在ExecutorService上调用shutdown()之前(或者使用带有线程的作业完成)之前,可以使用上述方法。