import java.util.*; import java.io.*; public class Scheduler { //Address of File name relative to code. Replace with request for filename? String fileName = "datafiles/datafile1.txt"; LinkedList processList = new LinkedList(); LinkedList randomNum = new LinkedList<>(); int randomNumConsumed = -1; //Counter to track which "random numbers" have been used thus far. //Initialise Dispatcher time variable int disp; /** * Main. Runs the program */ public static void main(String[] args){ Scheduler system = new Scheduler(); system.run(); } /** * Run. Most of the program starts from here. */ public void run() { readFile(fileName); //Read the file //Test Print System.out.println("DISP: " + disp + "\n"); System.out.println("Begin Process List:"); for (int i = 0; i < processList.size() ; i++) { System.out.println("ID: " + processList.get(i).getId()); System.out.println("Arrive: " + processList.get(i).getArrive()); System.out.println("ExecSize: " + processList.get(i).getExecSize()); System.out.println("Tickets: " + processList.get(i).getTickets()); System.out.println(); } System.out.println("End Process List.\n"); System.out.println("Begin Random:"); for (int i = 0; i < randomNum.size(); i++) { System.out.println(randomNum.get(i)); } System.out.println("End Random."); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); algorithmLTR(); } /** * readFile. Reads the file given, creating processes as needed to save details. * @param fileNameInput address of the file to be read in. */ public void readFile(String fileNameInput) { Scanner fileReader; //Scanner to read the file. File dataSet = new File(fileNameInput); //Try and open file. If it works, procede. try { fileReader = new Scanner(dataSet); System.out.println("File Opened."); //Progress through each line in the text file while(fileReader.hasNextLine()){ String line = fileReader.nextLine(); //If the line has "EOF" written, stop reading lines. if(line.equals("EOF")) { System.out.println("End of File Reached"); break; } else if(line.startsWith("DISP")) { disp =Integer.parseInt(line.substring(6)); } //If the Line starts with "ID:", create a new process else if(line.startsWith("ID:")) { //Create new proccess Process temp = new Process(); temp.setId(line.substring(4)); //Set the id of the proccess to whatever remains of the line after the "ID: " //As we've read in the ID, we shall assume the following lines (until "END") are all part of the process definition. while(fileReader.hasNextLine()) { line = fileReader.nextLine(); if(line.equals("END")) { break; } else if(line.startsWith("Arrive:")) { temp.setArrive(Integer.parseInt(line.substring(8))); } else if(line.startsWith("ExecSize:")) { temp.setSize(Integer.parseInt(line.substring(10))); } else if(line.startsWith("Tickets:")) { temp.setTickets(Integer.parseInt(line.substring(9))); } else { //Delete process? } } processList.add(temp); } //If we read the line "BEGINRANDOM", we've started the random numbers section. Until the "ENDRANDOM" line, //we'll just keep reading in each number (and it is assumed each line is a single number) and adding it //to the random number array. else if(line.equals("BEGINRANDOM")) { while(fileReader.hasNextLine()) { line = fileReader.nextLine(); if(line.equals("ENDRANDOM")) { break; } else { randomNum.add(Integer.parseInt(line)); } } } } fileReader.close(); } //If the file isn't found, throw a hissy fit. catch (FileNotFoundException e) { System.out.println("File not found."); //e.printStackTrace(); //Optional, shows more data. } } public void algorithmFCFS() { } public void algorithmSRT() { } public void algorithmFBV() { } public void algorithmLTR() { // counter: used to track if we’ve found the winner yet int counter = 0; int totalTickets = 0; int winner = -1; //count the total number of tickets in play for (int i = 0; i < processList.size() ; i++) { totalTickets += processList.get(i).getTickets(); } // winner: use some call to a random number generator to // get a value, between 0 and the total # of tickets int winnerValue = returnRandomNum(totalTickets); for (int i = 0; i < processList.size(); i++) { counter = processList.get(i).getTickets(); if(counter > winnerValue) { winner = i; break; } } if(winner == -1) { System.out.println("No winner"); } else { System.out.println("Winner: " + processList.get(winner).getId()); } // current: use this to walk through the list of jobs //node_t *current = head; /* while (current) { counter = counter + current->tickets; if (counter > winner) { break; // found the winner } current = current->next; // 'current' is the winner: schedule it... } */ } public int returnRandomNum(int totalTickets) { int randomValue = 0; //Loop back to begining. Probably could remove each consumed random number from the linked list.... but I don't want to right now. if((randomNumConsumed+1) >= randomNum.size()) { randomNumConsumed = 0; } else { randomNumConsumed += 1; } randomValue = randomNum.get(randomNumConsumed) % totalTickets; return randomValue; } }