Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在executorservice场景中等待另一个线程_Java_Multithreading - Fatal编程技术网

Java 在executorservice场景中等待另一个线程

Java 在executorservice场景中等待另一个线程,java,multithreading,Java,Multithreading,假设有三个使用executor服务创建的线程,现在我希望t2在t1之后开始运行,t3在t2之后开始运行。在线程池的情况下,如何实现这种场景 如果它将使用thread.start()创建任何普通线程。我可以使用join()方法等待。但是如何处理上述场景呢?线程t1、t2和t3可以实现可调用接口,并且可以从调用方法返回一些值。 根据返回值,在t1返回后,可以启动t2,类似地,也可以启动t3 “可调用”就是它的答案您混淆了线程的概念以及在线程上执行的内容。线程池中的线程何时“启动”并不重要,但处理的执

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


如果它将使用thread.start()创建任何普通线程。我可以使用join()方法等待。但是如何处理上述场景呢?

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


“可调用”就是它的答案

您混淆了线程的概念以及在线程上执行的内容。线程池中的线程何时“启动”并不重要,但处理的执行何时开始或继续并不重要。因此,更好的说法是,您有3个
可调用项
可运行项
,您需要其中一个在继续之前等待另外两个。这是通过使用一个。创建计数为2的共享闩锁。两个
可调用项
将调用闩锁,应该等待的将调用(可能会超时)。

提交给ExecutorService的作业必须相互独立。如果您试图通过等待信号量、倒计时闩锁或类似方式来建立依赖关系,那么当所有可用工作线程执行等待已提交作业但在队列中当前作业之后的作业时,您将面临阻塞整个服务的风险。你要确保你有比可能阻止工作更多的工人。在大多数情况下,最好使用多个Executor服务,并将从属组的每个作业提交给不同的服务。

有几个选项:

  • 如果这是您必须处理的唯一场景(t1->t2->t3),那么不要使用线程池。按顺序运行这三个任务

  • 使用一些线程间通知机制(例如BlockingQueue、CountDownLatch)。这要求您的任务保留对所选同步工具的共享引用

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

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


  • 为什么在这里需要多线程,如果需要顺序行为,请参见[here][1][1]讨论的主题:那么,除了可调用之外,还有其他方法吗?可调用仅在Java中引入。使用Callable有什么问题吗?