// 如果下一节点的入度是0,将入度为 0 的节点入栈,用于下一次遍历
if (nextNode.inDegree == 0) {
nodeStack.push(nextNode);
}
}
}
}
// 抛出异常中断程序异常信息中提示 存在环的相关 Task
if (taskCount != topologicalSort.size()) {
taskNodes.removeAll(topologicalSort);
StringBuilder builder = new StringBuilder();
builder.append(" [");
for (TaskNode taskNode : taskNodes) {
builder.append(taskNode.getClass().getSimpleName());
builder.append(“,”);
}
builder.append(" ]");
throw new RuntimeException(“there is a ring among” + builder.toString());
}
}
上图是一个有向无环图,输出的拖布排序序列为[1,2,4,3,5],如果 3,5 是循环依赖关系,则排序只会输出[1,2,4]就结束了。图中的元素无法全部遍历完成。
2.3 多线程遍历图
因为牵扯子线程初始化任务,必须确保在跳转第一个业务页面时,所有的Task都初始化完成了。也就是说从遍历开始到结束,主线程是不可以跳转到闪屏页面的,而且部分初始化会在主线程进行。阻塞主线程就成了必需要做的事。
多线程遍历
runTask(root); // 开始遍历
waitMain();
private void runTask(final TaskNode taskNode) {
// 只有入度为0的节点才能开始运