import java.util.
*;
class Process {
int id;
int arrivalTime;
int burstTime;
int remainingTime;
public Process(int id, int arrivalTime, int burstTime) {
this.id = id;
this.arrivalTime = arrivalTime;
this.burstTime = burstTime;
this.remainingTime = burstTime;
public class SRTFScheduling {
public static void main(String[] args) {
List<Process> processes = new ArrayList<>();
processes.add(new Process(1, 0, 5));
processes.add(new Process(2, 2, 3));
processes.add(new Process(3, 4, 2));
processes.add(new Process(4, 6, 4));
srtfScheduling(processes);
public static void srtfScheduling(List<Process> processes) {
int currentTime = 0;
int totalWaitingTime = 0;
int completedProcesses = 0;
PriorityQueue<Process> queue = new PriorityQueue<>(Comparator.comparingInt(p ->
p.remainingTime));
while (completedProcesses < processes.size()) {
for (Process process : processes) {
if (process.arrivalTime <= currentTime && !queue.contains(process)) {
queue.add(process);
if (!queue.isEmpty()) {
Process currentProcess = queue.poll();
System.out.println("Executing process " + currentProcess.id + " at time " + currentTime);
currentProcess.remainingTime--;
if (currentProcess.remainingTime == 0) {
completedProcesses++;
totalWaitingTime += currentTime - currentProcess.arrivalTime - currentProcess.burstTime + 1;
System.out.println("Process " + currentProcess.id + " completed at time " + (currentTime +
1));
} else {
System.out.println("Idle at time " + currentTime);
currentTime++;
}
System.out.println("Average waiting time: " + (double) totalWaitingTime / processes.size());