我被要求做一个特定算法的多线程模拟器。 其中一项任务是将常规计划结果与循环结果进行比较。 当我在寻找有关循环调度方法的信息时,我发现了不同的一般解释和一些代码示例,我找不到它们之间的任何关系和调度线程。 例如这段代码(在堆栈溢出时找到):
public static void RR3(int numProcess, int[] cpuBurst, int[] arrivalTime){
int quantum = 3,time = 0, temp;
int completionTime = 0;
LinkedList <Integer>process = new LinkedList();
for (int i = 0; i < numProcess; i++) {
process.add(i, cpuBurst[i]);
}
while (process.isEmpty() != true){
for (int j = 0; j < quantum; j++) {
System.out.println(process.getFirst());
if(process.peek() == 0 ){
completionTime = completionTime + time;
process.remove();
}
else{
temp = process.pop();
process.push(temp - 1);
time++;
}
}
process.addLast(process.getFirst());
process.removeFirst();
}
double act = (double) completionTime/numProcess;
System.out.println("-----------------RR3-----------------");
System.out.println(" Act = " + act + "ms");
}
除了表示流程数量,每个等等的时间的整数之外,我什么都看不到,但我如何实际管理他们的行为呢?我没有看到任何要求运行或停止的过程。
答案 0 :(得分:3)
你已经注意到这是一个抽象。即没有执行真正的工作。相反,工作只是由一组表示工作量的整数“模仿”。
关于如何运行或停止进程的问题在算法本身中有些隐藏:LinkedList
存储“活动”进程。它们都是从一开始就开始的。在每个回合中,他们都会收到一个短时间段,他们可以在那里完成一些工作。完成所有工作后,将从列表中删除它们。
在最简单的形式中,当Integer值被实际任务替换时,您可以替换行
if(process.peek() == 0 ){ ... }
类似
Task task = process.peek();
if (task.isFinished()) { ... }
否则(在其他情况下),当有工作要做时,你可以替换行
temp = process.pop();
process.push(temp - 1);
类似
Task task = process.peek();
task.doALittleBitOfWork();
您发布的代码原本是问题的一部分,因此必须假设它仍然有问题,但也许它足以获得基本想法。