我有一个场景,我必须同时调用多个对象,每个对象将在内部调用多个其他类的对象。在执行所有子对象之后,它应该将结果返回给父对象,最后,父对象将结果返回给主线程。它基本上是两级多线程。在实现这个场景时,我不知道应该考虑什么。我非常感谢任何和所有的指导,最好是一些示例代码。
我附上了一张图片,清楚地了解了该场景。
简单我需要创建一组线程,每个创建的线程都必须创建另一组线程。并且还要求在任何时候控制每个线程。希望再次明确感谢
答案 0 :(得分:1)
ForkJoinPool和RecursiveTask专为此类用例而设计。见fork-join tag
答案 1 :(得分:0)
您可以在主对象上创建N个父线程,并在每个线程对象上调用start后,可以在每个对象上调用连接。主要对象将阻止第一个等待它完成,一旦它完成它将尝试加入第二个,第三个,依此类推,直到第N个,但它们可能已经完成然后主要将是能够完成。
在父母和孩子之间的关系中使用相同的方法。但是,从你的问题中不清楚子线程必须做什么,你可能需要根据手头的任务在它们之间提供一些并发控制。
干杯。
答案 2 :(得分:0)
根据我的理解:每个父母都会产生一定数量的孩子,并且必须等待所有孩子(以及孩子的孩子等)完成?
在这种情况下,每个父母可以为每个孩子产生一个线程,然后使用semaphore等待所有孩子完成。信号量允许您一次等待多个线程。
编辑:你提到了四个任务。ADD线程:创建一个新线程,管理其父级列表中的所有线程。使用同步来维护该列表,因为如果不能保证只有一个线程会触及此列表。
PAUSE:设置PAUSED标志。这将导致线程转到sleep()
或wait()
。
恢复:取消设置PAUSED标志。如果PAUSE发出线程wait()
,请拨打notify()
将其唤醒。
DELETE:设置STOPPED标志,然后从列表中删除,或等到线程完成后再从列表中删除(取决于您需要的内容)。如果线程可能是PAUSED,请确保首先恢复它。
运行循环的线程必须使用这些标志来确定:是否要暂停以及是否退出循环,从而停止线程。像这样:
while (!isStopped)
{
while (hasWork() && !isPaused && !isStopped)
{
// do work
}
if (!isStopped)
{
// either just sleep for a few milliseconds (easy way) or wait()
}
}
确保不会产生太多线程。如果你已经产生了超过x
个线程,那么你应该让孩子等待而不是创建更多线程,其中x
取决于你的操作系统和JVM。玩弄它。直觉可能会告诉你:线程越多越好,但这绝对是假的。一旦超过一定数量的线程,它们就已经在使用所有计算机的可用资源(例如CPU,内存带宽和硬盘带宽)。产生比使用所有资源所需的线程更多的线程只会增加管理开销并减慢执行速度。
在现代系统上,竞争线程调度可能做得很好,但每个线程仍然有它的价格标签。想象一下,所有线程都希望同时访问CPU,内存等。这会产生争用,并且需要一个非常智能的调度程序(足够智能以预测未来以及谁可以做到这一点?)不会导致任何明显的开销。
祝你好运。