(SJF分为PReemptive shortest job first(抢占式)和non-preemptive shortest job first(非抢占式),本位涉及的是后者,前者比后者复杂)
FCFS核心代码如下:
1packageme.ares.algorithms;23importjava.util.List;4importme.ares.domain.Process;5importme.ares.utils.ProcessUtil;67publicclassFCFS {8privateList<Process>processes;910publicFCFS(String fileString){11processes =ProcessUtil.readProcesses(fileString);12}1314publicvoidexecute(){15ProcessUtil.sortByArrivalTime(processes);16intcurrentTime = 0;17for(inti = 0; i < processes.size(); i++) {18System.out.println("时刻"+currentTime+": 进程"+processes.get(i).getProcessID()+"启动");19if(processes.get(i).getArrivalTime()>=currentTime){20processes.get(i).setStartingTime(processes.get(i).getArrivalTime());21processes.get(i).setFinishingTime(processes.get(i).getStartingTime()+processes.get(i).getServiceTime());22processes.get(i).setTurnAroundTime(processes.get(i).getFinishingTime()-processes.get(i).getArrivalTime());23processes.get(i).setAverageTAT((double)processes.get(i).getTurnAroundTime() /processes.get(i).getServiceTime());24}else{25processes.get(i).setStartingTime(currentTime);26processes.get(i).setFinishingTime(processes.get(i).getStartingTime()+processes.get(i).getServiceTime());27processes.get(i).setTurnAroundTime(processes.get(i).getFinishingTime()-processes.get(i).getArrivalTime());28processes.get(i).setAverageTAT((double)processes.get(i).getTurnAroundTime() /processes.get(i).getServiceTime());29}30currentTime =processes.get(i).getFinishingTime();31}3233System.out.println("---------------------------------------------------------------------");3435ProcessUtil.sortByID(processes);36for(Process p : processes){37System.out.println(p);38}39}40}
SJF核心代码如下
1packageme.ares.algorithms;23importjava.util.List;4importme.ares.domain.Process;5importme.ares.utils.ProcessUtil;67publicclassSJF {8privateList<Process>processes;910//从文件读入模拟进程11publicSJF(String fileString) {12processes =ProcessUtil.readProcesses(fileString);13}1415publicvoidexecute() {16ProcessUtil.sortByServiceTime(processes);17intcurrentTime = 0;//起始时刻18intnext;19while((next=nextVisit(currentTime))!=-1){20System.out.println("时刻"+currentTime+": 进程"+processes.get(next).getProcessID()+"启动");21processes.get(next).setStartingTime(currentTime);22processes.get(next).setFinishingTime(processes.get(next).getServiceTime()+processes.get(next).getStartingTime());23processes.get(next).setTurnAroundTime(processes.get(next).getFinishingTime()-processes.get(next).getArrivalTime());24processes.get(next).setAverageTAT((double)processes.get(next).getTurnAroundTime() /processes.get(next).getServiceTime());25currentTime =processes.get(next).getFinishingTime();26}27System.out.println("---------------------------------------------------------------------");28ProcessUtil.sortByID(processes);29for(Process p : processes){30System.out.println(p);31}32}3334privateintnextVisit(intcurrentTime) {35for(inti = 0; i < processes.size(); i++) {36if(processes.get(i).isVisited() ==false&& processes.get(i).getArrivalTime() <currentTime) {37processes.get(i).setVisited(true);38returni;39}40}41returnProcessUtil.findFirstArrival(processes);//先到达先执行;42}43}
模拟Process的对象模型
1packageme.ares.domain;23publicclassProcess {4privatecharprocessID;5privateintarrivalTime;//到达时间6privateintserviceTime;//服务时间7privateintstartingTime;//开始时间8privateintfinishingTime;//完成时间9privateintturnAroundTime;//周转时间10privatedoubleaverageTAT;//带权周转时间11privatebooleanvisited =false;1213publicProcess(charprocessID,intarrivalTime,intserviceTime) {14super();15this.processID =processID;16this.arrivalTime =arrivalTime;17this.serviceTime =serviceTime;18}1920publicchargetProcessID() {21returnprocessID;22}2324publicvoidsetProcessID(charprocessID) {25this.processID =processID;26}2728publicintgetArrivalTime() {29returnarrivalTime;30}31publicvoidsetArrivalTime(intarrivalTime) {32this.arrivalTime =arrivalTime;33}34publicintgetServiceTime() {35returnserviceTime;36}37publicvoidsetServiceTime(intserviceTime) {38this.serviceTime =serviceTime;39}40publicintgetStartingTime() {41returnstartingTime;42}43publicvoidsetStartingTime(intstartingTime) {44this.startingTime =startingTime;45}46publicintgetFinishingTime() {47returnfinishingTime;48}49publicvoidsetFinishingTime(intfinishingTime) {50this.finishingTime =finishingTime;51}52publicintgetTurnAroundTime() {53returnturnAroundTime;54}55publicvoidsetTurnAroundTime(intturnAroundTime) {56this.turnAroundTime =turnAroundTime;57}58publicdoublegetAverageTAT() {59returnaverageTAT;60}61publicvoidsetAverageTAT(doubleaverageTAT) {62this.averageTAT =averageTAT;63}6465publicbooleanisVisited() {66returnvisited;67}6869publicvoidsetVisited(booleanvisited) {70this.visited =visited;71}7273@Override74publicString toString() {75return"Process [processID=" + processID + ", arrivalTime="76+ arrivalTime + ", serviceTime=" +serviceTime77+ ", startingTime=" + startingTime + ", finishingTime="78+ finishingTime + ", turnAroundTime=" +turnAroundTime79+ ", averageTAT=" +averageTAT80+ "]";81}8283}
操作Process的便捷工具类
1packageme.ares.utils;23importjava.io.File;4importjava.io.FileNotFoundException;5importjava.util.ArrayList;6importjava.util.Comparator;7importjava.util.List;8importjava.util.Scanner;910importme.ares.domain.Process;1112publicclassProcessUtil {1314publicstaticList<Process>readProcesses(String fileString){15List<Process> processes =newArrayList<Process>();16Scanner scanner =null;17try{18scanner =newScanner(newFile(fileString));19while(scanner.hasNext()) {20charprocessID = scanner.next().charAt(0);21intarrivalTime =scanner.nextInt();22intserviceTime =scanner.nextInt();23processes.add(newProcess(processID, arrivalTime, serviceTime));24}25}catch(FileNotFoundException e) {26e.printStackTrace();27}28scanner.close();29returnprocesses;30}3132publicstaticvoidsortByServiceTime(List<Process>processes) {33processes.sort(newComparator<Process>() {34publicintcompare(Process o1, Process o2) {35if(o1.getServiceTime() >o2.getServiceTime()) {36return1;37}elseif(o1.getServiceTime() ==o2.getServiceTime()) {38return0;39}else{40return-1;41}42}43});44}4546publicstaticvoidsortByID(List<Process>processes) {47processes.sort(newComparator<Process>(){4849@Override50publicintcompare(Process o1, Process o2) {51if(o1.getProcessID()>o2.getProcessID()) {52return1;53}elseif(o1.getProcessID() ==o2.getProcessID()) {54return0;55}else{56return-1;57}58}5960});61}6263publicstaticvoidsortByArrivalTime(List<Process>processes){64processes.sort(newComparator<Process>() {6566@Override67publicintcompare(Process o1, Process o2) {68if(o1.getArrivalTime()>o2.getArrivalTime())return1;69elseif(o1.getArrivalTime()==o2.getArrivalTime())return0;70elsereturn-1;71}72});73}7475publicstaticintfindFirstArrival(List<Process>processes) {76intfirstArrival =Integer.MAX_VALUE;77intindex = -1;78for(inti = 0; i < processes.size(); i++) {79if(processes.get(i).isVisited() ==false80&& processes.get(i).getArrivalTime() <firstArrival) {81firstArrival =processes.get(i).getArrivalTime();82index =i;83}84}85if(index != -1)86processes.get(index).setVisited(true);//index值改变代表进程被找到,设置进程visited值87returnindex;88}8990}
//---------------------------------------------------------测 试 如 下(Junit单元测试)----------------------------------------------------------------------------------------------------
1packageme.ares.junittest;23importme.ares.algorithms.FCFS;4importorg.junit.Test;56publicclassFCFS_Test {78FCFS fcfs =newFCFS("test.txt");910@Test11publicvoidtestExecute() {12fcfs.execute();13}1415}
packageme.ares.junittest;importme.ares.algorithms.SJF;importorg.junit.Test;publicclassSJF_Test {
SJF sjf=newSJF("test.txt");
@TestpublicvoidtestExecute() {
sjf.execute();
}
}
----------------------------------如有疑惑请留言噢--------------------------