-1

假设使用执行器服务创建了三个线程,现在我希望 t2 在 t1 之后开始运行,而 t3 在 t2 之后开始运行。在线程池的情况下如何实现这种场景?

如果它有任何使用thread.start()创建的正常线程。我本可以使用 join() 方法等待。但是如何处理上述情况?

4

4 回答 4

0

线程 t1,t2 和 t3 可以实现可调用接口,并且可以从调用方法返回一些值。根据返回值,t1返回后,可以启动t2,t3也类似。

“可调用”是它的答案

于 2013-03-05T11:59:51.767 回答
0

您混淆了线程的概念以及在线程上执行的内容。线程池中的线程何时“启动”无​​关紧要,但处理的执行何时开始或继续。所以更好的说法是你有 3 个CallablesorRunnables并且你需要其中一个来等待另外两个,然后再继续。这是使用CountDownLatch完成的。创建一个计数为 2 的共享锁存器。其中 2 个Callables将在锁存器上调用countDown(),应该等待的将调用await()(可能有超时)。

于 2013-03-05T12:04:40.170 回答
0

提交给 ExecutorService 的作业必须相互独立。如果你试图通过等待 Semaphores、CountDownLatches 或类似的东西来建立依赖关系,那么当所有可用的工作线程执行等待已提交的作业但落后于当前作业的作业时,你将面临阻塞整个服务的风险。队列。你要确保你有比可能的阻塞工作更多的工人。在大多数情况下,最好使用多个 ExecutorService 并将依赖组的每个作业提交给不同的 Service。

于 2013-03-05T12:11:08.153 回答
0

几个选项:

  1. 如果这是您必须处理的唯一场景(t1->t2->t3),请不要使用线程池。依次运行这三个任务。

  2. 使用一些线程间通知机制(例如 BlockingQueue、CountDownLatch)。这要求您的任务持有对您选择的同步工具的共享引用。

  3. 使用新的可运行/可调用包装任何依赖序列,以作为单个任务提交。这种方法很简单,但不能正确处理非线性依赖拓扑。

  4. 每个依赖于另一个任务的任务都应该提交另一个任务以执行,并等待其完成。这是具有依赖关系的线程池的通用方法,但它需要仔细调整以避免可能的死锁(正在运行的任务可能会等待没有可用线程运行的任务。请参阅我的回复获得简单的解决方案)。

于 2013-03-05T12:15:55.297 回答