Java實(shí)現(xiàn)時(shí)間片輪轉(zhuǎn)調(diào)度算法的示例代碼
本程序用時(shí)間片輪轉(zhuǎn)調(diào)度算法對(duì)五個(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)容請(qǐng)搜索腳本之家以前的文章或繼續(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-12
Springboot配置全局跨域未生效,訪問接口報(bào)錯(cuò)問題及解決
這篇文章主要介紹了Springboot配置全局跨域未生效,訪問接口報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
SpringBoot集成itext導(dǎo)出PDF的過程
本文介紹了如何在Spring Boot中集成iText庫導(dǎo)出PDF文件,并解決中文亂碼問題,步驟包括添加依賴、準(zhǔn)備字體、打開系統(tǒng)字體目錄選擇字體、在控制器中新增方法、創(chuàng)建并測試UserPdfExportService類,以及添加請(qǐng)求頭,感興趣的朋友一起看看吧2024-11-11
MySQL數(shù)據(jù)文件直接通過拷貝備份與恢復(fù)的操作方法
這篇文章主要介紹了MySQL數(shù)據(jù)文件直接通過拷貝備份與恢復(fù)的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
地址到經(jīng)緯度坐標(biāo)轉(zhuǎn)化的JAVA代碼
這篇文章介紹了地址到經(jīng)緯度坐標(biāo)轉(zhuǎn)化的JAVA代碼,有需要的朋友可以參考一下2013-09-09
JAVA線程sleep()和wait()詳解及實(shí)例
這篇文章主要介紹了JAVA線程sleep()和wait()詳解及實(shí)例的相關(guān)資料,探討一下sleep()和wait()方法的區(qū)別和實(shí)現(xiàn)機(jī)制,需要的朋友可以參考下2017-05-05
Springboot hibernate envers使用過程詳解
這篇文章主要介紹了Springboot hibernate envers使用過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

