如何使用图论调度执行顺序? [重复]

问题描述

|                                                                                                                   这个问题已经在这里有了答案:                                                      

解决方法

        我建议一种拓扑结构。 快速检查之后,使用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;
        }
    }
}