解决一般依赖关系的算法

时间:2011-09-20 01:02:19

标签: multithreading thread-safety dependencies

想象一下,如果你有一堆相互依赖的方法(在这种情况下是Java)。

  • methodY取决于methodA,methodB,methodC
  • methodX依赖于methodA,methodB
  • methodB依赖于methodA,methodF
  • methodT不依赖于任何事情
  • methodU取决于methodW
  • 等等

如果methodA依赖于methodB,则意味着必须在执行methodA之前先执行methodB。

假设您不必担心循环依赖。

每个方法都由一个Thread运行,有一个固定大小的线程池。

如果没有循环依赖关系,它们最终都可以运行吗?
我如何对线程进行排队,以便所有线程最终运行?

例如,这不起作用 methodA依赖于methodB,methodC依赖于methodB,线程池大小为2.如果我将方法A和方法C排队,它们将无限期地挂起,因为它们都在等待methodB但是池已经满了。

1 个答案:

答案 0 :(得分:0)

当你考虑它时,分开线程和方法。方法是线程正在执行的。

你应该拥有(在这种情况下)2个可以执行任何方法的线程。他们将选择一个已经执行了所有依赖项的方法,然后运行它。

重复此操作,直到方法队列为空。

顺便说一句,如果允许你在完成所有依赖项的时候开始执行一个方法(我的意思是,如果允许你将它留在队列中)那么逻辑就是最简单的。