用java語言模擬短作業優先演算法
阿新 • • 發佈:2018-11-28
package two; public class Job { private String name;//作業名稱(ID) private int execTime; //執行時間 private long startTime;//開始時間 private int endTime;//結束時間 private int totalTime;//週轉時間 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getExecTime() { return execTime; } public void setExecTime(int execTime) { this.execTime = execTime; } public long getStartTime() { return startTime; } public void setStartTime(long startTime) { this.startTime = startTime; } public int getEndTime() { return endTime; } public void setEndTime(int endTime) { this.endTime = endTime; } public int getTotalTime() { return totalTime; } public void setTotalTime(int totalTime) { this.totalTime = totalTime; } public Job( long startTime,int execTime) { super(); this.execTime = execTime; this.startTime = startTime; } public Job(){} }
package two; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Scanner; public class SJF { // 所有的作業的集合 private static List<Job> jobs = new ArrayList<Job>(); //按執行時間排序 public static void sortList() { Collections.sort(jobs, new Comparator<Job>() { @Override public int compare(Job job1, Job job2) { return (int) (job1.getExecTime() - job2.getExecTime()); } }); } public static void main(String[] args) { //單通道多工同時到達 long startTime=System.currentTimeMillis(); Scanner scan=new Scanner(System.in); System.out.println("請輸入作業的數量:"); int jobNum=new Integer(scan.nextLine()); for(int i=0;i<jobNum;i++){ System.out.println("請輸入第"+(i+1)+"個作業的名稱:"); String name=scan.nextLine(); System.out.println("請輸入第"+(i+1)+"個作業的執行時間:"); String executeTime=scan.nextLine(); Job job=new Job(); job.setName(name); job.setExecTime(new Integer(executeTime)); job.setStartTime(startTime); jobs.add(job); } sortList(); //計算每個任務的週轉時間 int temp=0; for(Job job:jobs){ //得到每個作業的執行時間 int execTime = job.getExecTime(); temp+=execTime; //執行時間加上等待時候 job.setTotalTime(temp); } //列印結果並求出平均週轉時間 int sum=0; for(int j=0;j<jobs.size();j++){ Job job=jobs.get(j); int totalTime = job.getTotalTime(); System.out.println("作業("+job.getName()+") 的執行時間為:"+job.getExecTime()+"s 週轉時間為:"+totalTime); System.out.println("開始執行==="); try{ Thread.sleep(job.getExecTime()*1000); }catch(Exception e){} System.out.println(" ....."+job.getName()+"執行結束\n"); sum+=totalTime; } System.out.println("平均週轉時間為:"+(sum*1.0/jobNum)+"s"); } }
測試效果: