假设使用执行程序服务创建了三个线程,现在我希望t2在t1之后开始运行,而t3将在t2之后开始运行。在线程池的情况下如何实现这种场景?
如果使用thread.start()创建任何普通线程。我可以等待使用join()方法。但是如何处理上述情况?
答案 0 :(得分:0)
线程t1,t2和t3可以实现可调用接口,并且从调用方法可以返回一些值。 根据返回值,在t1返回后,您可以启动t2,类似于t3。
“Callable”是它的答案
答案 1 :(得分:0)
你混淆了线程的概念和线程上执行的内容。线程池中的线程“启动”但开始或继续执行处理时无关紧要。所以更好的说法是你有3 Callables
或Runnables
,你需要其中一个等待其他两个才能继续。这是使用CountDownLatch完成的。创建一个计数为2的共享锁存器。Callables
中的2个将在锁存器上调用countDown(),应该等待的那个将调用await()(可能超时)。
答案 2 :(得分:0)
提交给ExecutorService的作业必须是相互独立的。如果您尝试通过等待信号量,CountDownLatches或类似方法来建立依赖关系,则当所有可用的工作线程执行等待已提交的作业但在当前作业后面的作业时,您将面临阻塞整个服务的风险。队列。您希望确保拥有的工作人员多于阻止工作的数量。在大多数情况下,最好使用多个ExecutorService并将依赖组的每个作业提交给不同的服务。
答案 3 :(得分:0)
一些选择:
如果这是您必须处理的唯一方案(t1-> t2-> t3),请不要使用线程池。按顺序运行三个任务。
使用一些线程间通知机制(例如BlockingQueue,CountDownLatch)。这要求您的任务保持对您选择的同步工具的共享引用。
使用新的runnable / callable包装任何依赖序列作为单个任务提交。这种方法很简单,但不能正确处理非线性依赖拓扑。
依赖于其他任务的每个任务都应提交其他任务以执行,并等待其完成。这是具有依赖性的线程池的通用方法,但它需要仔细调整以避免可能的死锁(运行任务可能会等待没有可用线程的任务运行。请参阅我的响应here简单的解决方案)。