package 多道程序设计;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
public static Queue<Procedure> waitQueue = new LinkedList<>();
public static Queue<Procedure> setoutQueue = new LinkedList<>();
public static int cut = 0; // 通道数;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(true) {
try {
System.out.println("请输入程序数:");
int t = sc.nextInt();
for (int i = 0; i < t; i++) {
System.out.println("请输入程序名:");
String s = sc.next();
System.out.println("请输入 计算时间 IO时间 计算时间:");
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
sc.nextLine();
waitQueue.offer(new Procedure(s, a, b, c));
}
solve();
} catch (Exception e) {
System.out.println("\nerror:请正确输入数据\n(1)请输入正整数,时间单位为ms\n(2)格式为: 计算 IO 计算");
}
while(true) {
System.out.println("是否继续进行(Y/N)");
String s = sc.next();
if(s.trim().equals("Y"))break;
else if(s.trim().equals("N"))System.exit(0);
System.out.println("请正确输入!");
}
}
}
private static void solve() {
while (!waitQueue.isEmpty() || !setoutQueue.isEmpty()) {
if (waitQueue.isEmpty()) {
while (!setoutQueue.isEmpty()) {
Procedure procedure2 = setoutQueue.poll(); // 进行IO操作的
io(procedure2);
System.out.println("程序" + procedure2.name + "在CPU上运行" + procedure2.cpu2 + "ms,程序运行完毕!");
}
}
if (setoutQueue.isEmpty()) {
if (waitQueue.isEmpty())
continue;
Procedure procedure = waitQueue.poll();
cpu(procedure);
setoutQueue.offer(procedure);
} else {
Procedure procedure1 = waitQueue.poll(); // 需要去CPU运行的
Procedure procedure2 = setoutQueue.poll(); // 进行IO操作的
long t1 = procedure1.cpu1;
long t2 = procedure2.io;
if (t1 >= t2) {
io(procedure2);
System.out.println("程序" + procedure1.name + "在CPU上运行" + t2 + "ms");
procedure1.cpu1 = t1 - t2;
System.out.println("程序" + procedure2.name + "在CPU上运行" + procedure2.cpu2 + "ms,程序运行完毕!");
((LinkedList<Procedure>) waitQueue).offerFirst(procedure1);
} else {
zt(procedure1, procedure2);
}
}
}
}
private static void zt(Procedure procedure1, Procedure procedure2) {
long t1 = procedure1.cpu1;
long T = procedure2.io;
System.out.println("程序" + procedure2.name + "进行io操作" + T + "ms");
while (t1 < T && !waitQueue.isEmpty()) {
T -= t1;
procedure1.cpu1 = 0;
System.out.println("程序" + procedure1.name + "在CPU上运行" + procedure1.cpu1 + "ms");
setoutQueue.offer(procedure1);
procedure1 = waitQueue.poll();
t1 = procedure1.cpu1;
}
((LinkedList<Procedure>) waitQueue).offerFirst(procedure1);
System.out.println("程序" + procedure2.name + "在CPU上运行" + procedure2.cpu2 + "ms,程序运行完毕!");
}
private static void cpu(Procedure procedure) {
System.out.println("程序" + procedure.name + "在CPU上运行" + procedure.cpu1 + "ms");
procedure.cpu1 = 0;
}
private static void io(Procedure procedure) {
System.out.println("程序" + procedure.name + "进行io操作" + procedure.io + "ms");
procedure.io = 0;
}
}
class Procedure {
String name;
long cpu1;
long io;
long cpu2;
public Procedure(String name, long cpu1, long io, long cpu2) {
this.name = name;
this.cpu1 = cpu1;
this.io = io;
this.cpu2 = cpu2;
}
}
/*
3
A
30 40 10
B
60 30 10
C
20 40 2
5 A 30 40 20 B 30 30 10 C 20 40 20 D 60 20 30 E 10 10 10
*/
java实现模拟多道程序设计
猜你喜欢
转载自blog.csdn.net/qq_40674583/article/details/89151586
今日推荐
周排行