问题描述
|
这个问题已经在这里有了答案:
解决方法
我建议一种拓扑结构。
快速检查之后,使用JGraphT即可轻松完成。
另请注意:
为了使该迭代器正常工作,该图必须是非循环的,并且不得在迭代过程中进行修改。当前,没有任何方法可以确保或快速失败。循环输入(包括自循环)或并发修改的结果是不确定的。要预检查图形的周期,请考虑使用CycleDetector或StrongConnectivityInspector。
, 我建议一种简单的按需加载方法,加载一个插件所依赖的所有插件(如果尚未加载)。
一些观察:
如果依赖关系树非常深(> 1,000个插件),则可能导致StackOverflowException
该解决方案是线程安全的,假设所有插件都一个接一个地加载并且同步进行
在加载所有依赖项之前,通过使用设置为
true
的ѭ0handled标志来处理在\“ graph \”中查找非法循环,并且仅在初始化插件后才将其设置回false
。
这种情况处理了插件显式启动另一个插件时的情况(不作为其依赖项的一部分,但不考虑异步初始化)
这是一个未经测试的示例,可以给出一个想法:
class Plugin {
Set<Plugin> dependencies;
boolean started,starting;
Plugin(Set<Plugin> deps) { dependencies = deps; }
void start() {
if (started) { /* already initialized */ }
else if (starting) { throw new IllegalArgumentException(\"Cyclic plugin dependency\"); }
else {
starting = true;
for (Plugin p : dependencies) { p.start(); }
/* initialize this plugin here */
starting = false;
started = true;
}
}
}