我有许多线程同时运行。在这几个线程中,执行依赖于其他线程的完成。 对于例如线程完成通知
螺纹 - 1,螺纹 - 2,螺纹 - 3
这些可以独立运行。
螺纹 - 4,取决于1的完成和2
螺纹 - 5,取决于1的完成和3
螺纹 - 6,取决于在1,2完成和3
所有的线程都被提交给执行者。线程4,5和6必须在启动之前实现一些等待机制。针对上述情况,Java中可能的阻止机制有哪些?
我有许多线程同时运行。在这几个线程中,执行依赖于其他线程的完成。 对于例如线程完成通知
螺纹 - 1,螺纹 - 2,螺纹 - 3
这些可以独立运行。
螺纹 - 4,取决于1的完成和2
螺纹 - 5,取决于1的完成和3
螺纹 - 6,取决于在1,2完成和3
所有的线程都被提交给执行者。线程4,5和6必须在启动之前实现一些等待机制。针对上述情况,Java中可能的阻止机制有哪些?
你得到一个Future<T>
obejct当您使用
Future<?> ExecutorService.submit(Runnable task)
只是未来传递给线程必须等待完成(例如,它的构造函数),做:
future.get();
这将阻止直到这个未来的线程结束。
您可以尝试使用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()之前(或者使用线程完成任务),可以使用上述方法。
建议使用像CountDownLatch或Future这样的阻塞工具可以在无限制的执行器上工作,或者至少能够同时启动所有6个线程,否则会存在线程匮乏的风险。所以使用Executor与没有Executor直接启动所有6个线程相比没有什么优势。
同时,依赖关系决定每个时刻不会有超过3个线程运行。如果线程的实际数量很重要,则应该使用事件驱动的设施而不是阻塞的设施。我的意思是收集信号的对象,当来自任务1和2的信号到达时,提交任务4等。从理论上来看,这类似于Petri nets
。不幸的是,JDK没有为事件驱动的任务协调提供标准类。从头开始实施这样的信号收集器/任务发射器并不困难,或者您可以使用数据流库df4j。
“所有线程都被提交给执行者” - 你的意思是“类型为Runnable的任务被提交给执行者”吗? –
是的,这些任务的类型是可运行的 – Abichellam