Java實(shí)現(xiàn)時(shí)間片輪轉(zhuǎn)調(diào)度算法的示例代碼
本程序用時(shí)間片輪轉(zhuǎn)調(diào)度算法對五個(gè)進(jìn)程進(jìn)行調(diào)度,假設(shè)每個(gè)進(jìn)程初始狀態(tài)為就緒狀態(tài)。
程序中的某進(jìn)程運(yùn)行時(shí)間以時(shí)間片單位為2進(jìn)行計(jì)算。
實(shí)現(xiàn)代碼
package bean; public interface process_scheduling_algorithm { public void round_cal(); public pcb get_process_round(); public int process_finish(); public void display_round(); public void set_state(); public void cpu_round(pcb q);// 采用時(shí)間片輪轉(zhuǎn)調(diào)度算法執(zhí)行某一進(jìn)程 public pcb get_next(pcb k, pcb head); }
package bean; public class pcb implements Cloneable{ private String name;//進(jìn)程名 private int cputime;//CPU 運(yùn)行時(shí)間 private int needtime;//運(yùn)行所需的時(shí)間 private int count;//執(zhí)行次數(shù) private int round;//時(shí)間片輪轉(zhuǎn)輪次 private state process;//進(jìn)程狀態(tài) private pcb next; public Object clone() { pcb person = null; try { person = (pcb)super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return person; } public void setName(String name) { this.name = name; } public String getName(){ return name; } public void setCputime(int cputime) { this.cputime = cputime; } public int getCputime(){ return cputime; } public void setCount(int count) { this.count = count; } public int getCount(){ return count; } public void setNeedtime(int needtime){ this.needtime = needtime; } public int getNeedtime(){ return needtime; } public void setRound(int round) { this.round = round; } public int getRound(){ return round; } public void setProcess(state process) { this.process = process; } public state getProcess(){ return process; } public void setNext(pcb p){ if(p!=null)next = (pcb) p.clone(); else next = null; } public pcb getNext(){ return next; } } enum state{ ready, execute, block, finish };// 定義進(jìn)程狀態(tài)
package bean; import java.util.LinkedList; import java.util.List; import java.util.Scanner; public class round_robin implements process_scheduling_algorithm,Cloneable{ public static final int P_NUM = 5; public static final int P_TIME = 50; public static List list = new LinkedList<pcb>(); //public int position = 1; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public void round_cal() { pcb p,r; p = get_process_round(); //System.out.println(p.getName()+"--------"); //display_round(p); int cpu = 0; r = (pcb)p.clone();//r = p; while (process_finish() == 0){ cpu += 2; cpu_round(r); r = (pcb) get_next(r,p).clone();//r = get_next(r,p); // System.out.println(r.getName() + "------"); System.out.println("cpu " + cpu); display_round(); set_state(); } } @Override public pcb get_process_round() { pcb q = new pcb(); pcb t = new pcb(); pcb p = new pcb(); int i = 0; System.out.println("input name and time"); while(i < P_NUM){ q.setName(cin.next()); q.setNeedtime(cin.nextInt()); q.setCputime(0); q.setRound(0); q.setCount(0); q.setProcess(state.ready); q.setNext(null); if(i == 0){ // p = q; p = (pcb) q.clone(); //System.out.println(p.needtime + "---------"); //t = q; t = (pcb) q.clone(); list.add(t); } else { //t.next = q; //創(chuàng)建就緒進(jìn)程隊(duì)列 t.setNext(q); //t = q; t = (pcb) q.clone(); list.add(t); } i++; } // for(int x=0;x<list.size();x++) { // pcb temp = (pcb) list.get(x); // System.out.println(temp.getName()); // } //System.out.println(p.getName() + "------"); return p; } //輸入模擬測試的進(jìn)程名和執(zhí)行所需時(shí)間 @Override public int process_finish() { //System.out.println(q.needtime + "------------"); int bl = 1,i = 0; while(bl!=0 && i < list.size()){ pcb q = (pcb) list.get(i); if(bl != 0 && q.getNeedtime() == 0)bl = 1; else bl = 0; i++; //q = q.next; // q = q.getNext(); // System.out.println(q.getName()); } return bl; } @Override public void display_round() { System.out.println("NAME CPUTIME NEEDTIME COUNT ROUND STATE"); for(int i=0;i<list.size();i++){ pcb p = (pcb) list.get(i); System.out.print(p.getName() + " "); System.out.print(p.getCputime() + " "); System.out.print(p.getNeedtime() + " "); System.out.print(p.getCount() + " "); System.out.print(p.getRound() + " "); switch (p.getProcess()){ case ready: System.out.println("ready"); break; case execute: System.out.println("execute"); break; case finish: System.out.println("finish"); break; } //p = p.getNext(); } } @Override public void set_state() { for(int i=0;i<list.size();i++){ pcb p = (pcb) list.get(i); if(p.getNeedtime() == 0) p.setProcess(state.finish); if(p.getProcess() == state.execute) p.setProcess(state.ready); //p = p.getNext(); } } @Override public void cpu_round(pcb q) { q.setCputime(q.getCputime() + 2);//q.cputime += 2; q.setNeedtime(q.getNeedtime() - 2);//q.needtime -= 2; if (q.getNeedtime() < 0) q.setNeedtime(0); q.setCount(q.getCount() + 1);//q.count++; q.setRound(q.getRound() + 1);//q.round++; q.setProcess(state.execute);//q.process = state.execute; for(int i=0;i<list.size();i++) { pcb temp = (pcb) list.get(i); if(q.getName() == temp.getName()) { list.remove(i); list.add(i, q); } } }//采用時(shí)間片輪轉(zhuǎn)調(diào)度算法執(zhí)行某一進(jìn)程 @Override public pcb get_next(pcb k, pcb head) { //System.out.println(k.getName() + " " + head.getName() + "------"); pcb t; t = (pcb) k.clone();//t = k; int opsition = 0; for(int i=0;i<list.size();i++) {//從列表中查找k的位置 pcb temp = (pcb) list.get(i); if(t.getName() == temp.getName()) { opsition = i; break; } } do { //t = t.getNext();//t = t.next; if(opsition+1 < list.size()) { t = (pcb) list.get(++opsition); //System.out.println(t.getName() +"-----------"); //break; } else{ opsition++; break; } }while(t != null && t.getProcess()== state.finish && opsition < list.size()); if(opsition == list.size()) { t = (pcb) head.clone();//t = head; //System.out.println(t.getName() + " -------------"); //while (t.getNext() != k && t.getProcess() == state.finish) t = t.getNext(); for(int i = 0; i < list.size(); i++){ pcb temp = (pcb) list.get(i); if(temp.getName() == t.getName()){ opsition = i; break; } } do { if(opsition+1 < list.size()) t = (pcb) list.get(++opsition); //opsition++; }while(t != null && t.getNext() != k && t.getProcess() == state.finish && opsition < list.size()); } return t; } public static void main(String[] args) { round_robin test = new round_robin(); test.round_cal(); } public Scanner cin = new Scanner(System.in); } /*測試樣例一 a1 2 a2 3 a3 4 a4 5 a5 6 測試樣例二 a1 2 a2 3 a3 4 a4 2 a5 4 */
到此這篇關(guān)于Java實(shí)現(xiàn)時(shí)間片輪轉(zhuǎn)調(diào)度算法的示例代碼的文章就介紹到這了,更多相關(guān)Java時(shí)間片輪轉(zhuǎn)調(diào)度算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java利用正則表達(dá)式提取數(shù)據(jù)的方法
最近由于項(xiàng)目需求需要提取txt里的數(shù)據(jù),之前用C#實(shí)現(xiàn)過,由于最近學(xué)習(xí)了java,所以嘗試用java實(shí)現(xiàn)下,這篇文章主要介紹了Java利用正則表達(dá)式提取數(shù)據(jù)的方法,需要的朋友可以參考下,下面來一起看看吧。2016-12-12Springboot配置全局跨域未生效,訪問接口報(bào)錯(cuò)問題及解決
這篇文章主要介紹了Springboot配置全局跨域未生效,訪問接口報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12SpringBoot集成itext導(dǎo)出PDF的過程
本文介紹了如何在Spring Boot中集成iText庫導(dǎo)出PDF文件,并解決中文亂碼問題,步驟包括添加依賴、準(zhǔn)備字體、打開系統(tǒng)字體目錄選擇字體、在控制器中新增方法、創(chuàng)建并測試UserPdfExportService類,以及添加請求頭,感興趣的朋友一起看看吧2024-11-11MySQL數(shù)據(jù)文件直接通過拷貝備份與恢復(fù)的操作方法
這篇文章主要介紹了MySQL數(shù)據(jù)文件直接通過拷貝備份與恢復(fù)的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09地址到經(jīng)緯度坐標(biāo)轉(zhuǎn)化的JAVA代碼
這篇文章介紹了地址到經(jīng)緯度坐標(biāo)轉(zhuǎn)化的JAVA代碼,有需要的朋友可以參考一下2013-09-09JAVA線程sleep()和wait()詳解及實(shí)例
這篇文章主要介紹了JAVA線程sleep()和wait()詳解及實(shí)例的相關(guān)資料,探討一下sleep()和wait()方法的區(qū)別和實(shí)現(xiàn)機(jī)制,需要的朋友可以參考下2017-05-05Springboot hibernate envers使用過程詳解
這篇文章主要介紹了Springboot hibernate envers使用過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06