我有很多并发运行的线程。在这几个线程中,执行取决于其他线程的完成。 例如,
线程 - 1,线程 - 2,线程 - 3
这些可以独立运行。
线程 - 4,取决于1和2的完成
线程 - 5,取决于完成1和3
线程 - 6,取决于完成1,2和3
所有线程都提交给执行者。线程4,5和6必须在启动之前实现一些等待机制。对于上述情况,java中可用的阻塞机制有哪些。
答案 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()之前(或者使用带有线程的作业完成)之前,可以使用上述方法。