public class P2_Printer{ private int[] time = {0}; //Really hacky solution, but seems easier than wrapping in a custom object. private char printerMode = 'M'; private P2_PrinterHead p1 = new P2_PrinterHead(); private P2_PrinterHead p2 = new P2_PrinterHead(); private P2_PrinterHead p3 = new P2_PrinterHead(); public P2_Printer() { //Nothing to set up. } public synchronized int requestHead() { int head = 1; int shortestTimeRemaining = p1.getTimeRemaining(); if(shortestTimeRemaining > p2.getTimeRemaining()) { shortestTimeRemaining = p2.getTimeRemaining(); head = 2; } if(shortestTimeRemaining > p3.getTimeRemaining()) { head = 3; } return head; } public boolean requestPrint(P2_Jobs jobInput, int headInput) { //Check if job can be done currently if(jobInput.getJobType()==printerMode) //If the job matches the current printer mode { //If there is an available head if(headInput==1) { //Send to a head to be printed and count the time int startTime = p1.print(jobInput, time); System.out.println("("+startTime+") "+jobInput.getId()+" uses head 1 (time: "+jobInput.getPages()+")"); return true; } else if(headInput==2) { int startTime = p2.print(jobInput, time); System.out.println("("+startTime+") "+jobInput.getId()+" uses head 2 (time: "+jobInput.getPages()+")"); return true; } else if(headInput==3) { int startTime = p3.print(jobInput, time); System.out.println("("+startTime+") "+jobInput.getId()+" uses head 3 (time: "+jobInput.getPages()+")"); return true; } else { return false; } } else { //Keep waiting and asking return false; } } }