/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package hw4_multithreadtrucks; import java.util.*; import pbxlogique.Pbx; /** * * @author Peilos */ public class Shovel extends Thread { private boolean bReady; //Is the Crusher in a ready state (is false if it's shutting down) private Vector truckList; //Trucks in queue go in here private int iShovelNumber; //Shovel number for this shovel. private int iLoadRate1 = 4; //Load rate for 20T and other trucks private int iLoadRate1Max = 6; private int iLoadRate2 = 8;//Load rate for 50T trucks only private int iLoadRate2Max = 12; private int oreLoaded=0;//Tracks the ammount of Ore loaded by this shovel. private double dIdleTime; //Stats, idle time after first truck arrives. private double dTrucksWaitTime; private boolean bFirstTruckArrive; private TimeCal myTimer = new TimeCal(); public Shovel() { super(); iShovelNumber = 0; bReady = true; truckList = new Vector(); dIdleTime = 0; bFirstTruckArrive = false; dTrucksWaitTime = 0; System.out.println("Shovel n°"+iShovelNumber+" is operational and free.... as always!"); } public Shovel(int iShovelNumber) { super(); this.iShovelNumber = iShovelNumber; truckList = new Vector(); dIdleTime = 0; bFirstTruckArrive = false; dTrucksWaitTime = 0; bReady = true; } //Places a truck in queue public synchronized void placeTruckInLine(Truck oTruck) { truckList.add(oTruck); } //Loads truck private synchronized void loadNextTruck() { double timeDelays; Truck currentTruck = (Truck) truckList.remove(0); //truck pre-processing dTrucksWaitTime += currentTruck.timeIt(); //End of truck specific pre-processing if (currentTruck.isJobFinished()) { currentTruck.sendTruckHome(); return; } System.out.println("Shovel n°"+this.iShovelNumber+" is handling the "+ currentTruck.getTruckerName()+" "+currentTruck.getTruckBucketSize()+ "T Truck and loading ore into it right now..."); if (currentTruck.getShovelNumber() != this.iShovelNumber) { System.out.println("Halt! An imposter came to the Shovel n°"+this.iShovelNumber+ " station. It was the "+currentTruck.getTruckerName()+" "+currentTruck.getTruckBucketSize()+ "T Truck... Ah well, we'll load the truck anyways..."); } if (currentTruck.getTruckBucketSize() == 50) { timeDelays = myTimer.RunAtPreDefinedRate(iLoadRate2*1000, iLoadRate2Max*1000); }else { timeDelays = myTimer.RunAtPreDefinedRate(iLoadRate1*1000, iLoadRate1Max*1000); } //Truck post-processing currentTruck.addWorkTime(timeDelays); //End truck post-processing oreLoaded = oreLoaded + currentTruck.getTruckBucketSize(); if (!currentTruck.addOre(currentTruck.getTruckBucketSize())) { System.out.println("There was a problem loading the "+currentTruck.getTruckBucketSize()+ "T Truck in "+timeDelays+" minutes. The truck refused to go to the Crusher."); } System.out.println("Shovel n°"+this.iShovelNumber+" loaded up the "+ currentTruck.getTruckerName()+" "+currentTruck.getTruckBucketSize()+ "T Truck in "+timeDelays+" minutes."); notifyAll(); return; } //Shuts down the shovel public synchronized void shutDownShovel()//Attemps to shutdown the Shovel. { bReady = false; System.out.println("NOTICE: Order to shut down Shovel n°"+this.iShovelNumber+" received."); } @Override public void run() { while (bReady) { System.out.println("Shovel n°"+iShovelNumber+" here. Waiting for the truck."); if (bFirstTruckArrive) { myTimer.TakeStartTime(); } while ((truckList.size()==0) && (bReady)) //Waiting for a truck { try { Thread.sleep(1); }catch (Exception E) { System.out.println("Oh no! The shovel broke :( Abandoning shovel n°"+iShovelNumber); bReady = false; } }//END While(truckList) if (bReady) { if (bFirstTruckArrive) { this.dIdleTime = dIdleTime + (myTimer.getNewTimeDifference() / 1000); } loadNextTruck(); bFirstTruckArrive = true; } } System.out.println("SHUTDOWN: Shovel n°"+this.iShovelNumber+" is shutting down now... ("+ oreLoaded+" Tonnes of Ore loaded on trucks). \r\n\t\tIdle time (after first truck passed through): "+ Pbx.antiDecimal(this.dIdleTime,2)+" minutes.\r\n\t\tTotal Time Lost due to Trucks stuck in line: "+ Pbx.antiDecimal(this.dTrucksWaitTime,2)+" minutes."); } }