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;
} //輸入模擬測(cè)試的進(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);
}
/*測(cè)試樣例一
a1 2
a2 3
a3 4
a4 5
a5 6
測(cè)試樣例二
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及數(shù)據(jù)庫(kù)對(duì)日期進(jìn)行格式化方式
這篇文章主要介紹了Java及數(shù)據(jù)庫(kù)對(duì)日期進(jìn)行格式化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
mybatis generator只能生成insert和selectAll的操作
這篇文章主要介紹了mybatis generator只能生成insert和selectAll的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
Spring啟動(dòng)過(guò)程中實(shí)例化部分代碼的分析之Bean的推斷構(gòu)造方法
這篇文章主要介紹了Spring啟動(dòng)過(guò)程中實(shí)例化部分代碼的分析之Bean的推斷構(gòu)造方法,實(shí)例化這一步便是在doCreateBean方法的?instanceWrapper?=?createBeanInstance(beanName,?mbd,?args);這段代碼中,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-09-09
java如何確定一個(gè)鏈表有環(huán)及入口節(jié)點(diǎn)
這篇文章主要介紹了java如何確定一個(gè)鏈表有環(huán)及入口節(jié)點(diǎn),想了解數(shù)據(jù)結(jié)構(gòu)的同學(xué)可以參考下2021-04-04
Springboot?注解EqualsAndHashCode詳解
注解@EqualsAndHashCode主要用于自動(dòng)生成equals方法和hashCode方法,callSuper屬性為true時(shí),生成的方法會(huì)包括父類字段,為false則只包含當(dāng)前類字段,IDEA工具中有檢查提示并可自動(dòng)修復(fù)相關(guān)代碼,確保注解正確使用,更多詳解可查閱相關(guān)文檔2024-10-10

