import java.time.Duration; import java.time.LocalTime; import java.util.*; public class Main { LinkedList<Process> list = new LinkedList<>(); LinkedList<Process> copyList = new LinkedList<>(); int n = sc.nextInt(); long timeSlice = sc.nextLong(); //to millis for (int i = 0; i < n; i++) { list.add(process); copyList.add(process); } processRoundRobin(copyList, timeSlice); list) { process.completeData(); } } double ART = 0, AWT = 0; list) { AWT += p.WT; ART += p.RT; } ART /= list.size(); AWT /= list.size(); } static void processRoundRobin(LinkedList<Process> list, long timeSlice){ LinkedList<Process> queue = new LinkedList<>(); LocalTime startTime = LocalTime.now(); while (list.size() != 0){ if(list.getFirst().AT <= Duration.between(startTime, LocalTime.now()).toMillis() / 1000.0){ queue.add(process); } } }); arriveTimeCheckThread.start(); while (list.size() !=0 || queue.size() != 0){ if(queue.size() != 0){ process.process(timeSlice); if(process.remainedTime > 0){ queue.add(process); }else { process.FT = Duration.between(startTime, LocalTime.now()).toMillis() / 1000.0; } } } }); processThread.start(); try { arriveTimeCheckThread.join(); processThread.join(); } } String name; double AT, CBT, FT, RT, WT; double remainedTime; @Override return "Process{" + "name='" + name + '\'' + ", AT=" + AT + ", CBT=" + CBT + '}'; } this.name = name; this.AT = AT; this.CBT = CBT; this.remainedTime = CBT; } void process(long timeSlice){ LocalTime startTime = LocalTime.now(); try { // System.out.println("timeSlice: " + timeSlice); } LocalTime now = LocalTime.now(); long processTime = Duration.between(startTime, now).toMillis(); // System.out.println(name + " process time:" + processTime); remainedTime -= processTime / 1000.0; // System.out.println(this + " remainedTime:" + remainedTime); } void completeData(){ RT = FT - AT; WT = RT - CBT; } } }