2013-11-26 101 views
1

我有许多线程同时运行。在这几个线程中,执行依赖于其他线程的完成。 对于例如线程完成通知

螺纹 - 1,螺纹 - 2,螺纹 - 3

这些可以独立运行。

螺纹 - 4,取决于1的完成和2

螺纹 - 5,取决于1的完成和3

螺纹 - 6,取决于在1,2完成和3

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

+0

“所有线程都被提交给执行者” - 你的意思是“类型为Runnable的任务被提交给执行者”吗? –

+0

是的,这些任务的类型是可运行的 – Abichellam

回答

3

你得到一个Future<T> obejct当您使用

Future<?> ExecutorService.submit(Runnable task) 

只是未来传递给线程必须等待完成(例如,它的构造函数),做:

future.get(); 

这将阻止直到这个未来的线程结束。

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()之前(或者使用线程完成任务),可以使用上述方法。

2

建议使用像CountDownLatch或Future这样的阻塞工具可以在无限制的执行器上工作,或者至少能够同时启动所有6个线程,否则会存在线程匮乏的风险。所以使用Executor与没有Executor直接启动所有6个线程相比没有什么优势。

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