package com.mini.process; import java.util.*; import java.io.*; //进程类,可以产生进程对象 class Process{ private String name; private int state; //0 表示就绪 1等待 private int sort; //优先级,sort越大优先级越高,随机产生(1-5) private int time; //执行时间 private Random rd=new Random(); //用于产生随机数 Process (String in_name){ name=in_name; time=rd.nextInt(20)+1; //随机产生0到19的整数 sort=rd.nextInt(5)+1; } int Begin_state(){ state=rd.nextInt(2); //返回随机产生的0或1,用于判断处于就绪还是等待队列 return state; } String getName(){ return name; } int getTime(){ return time; } void setTime(int inputtime){ time=inputtime; } int getSort(){ return sort; } void print(){ System.out.println("进程名 "+name+" "+"执行所需时间"+time+"ms"+"\t\t"+"进程状态: "+state+" "+"优先数 "+sort); } } //主类 public class ProcessCall{ //主函数,调用各种不同算法函数 public static void main(String []args)throws IOException{ LinkedList<Process> ready=new LinkedList<Process>(); //就绪队列链表头 LinkedList<Process> wait =new LinkedList<Process>(); //等待队列链表头 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); boolean in=true; String s=new String(); String []name={"a","b","c","d","e","f","g","h","i","j"}; //进程名 while(in){ for(int i=0;i<10;i++){ Process process=new Process(name[i]); //产生一个进程 if (process.Begin_state()==0){ ready.addLast(process); } else{ wait.addLast(process); } } System.out.println("\n选择调度算法"+"\n\n"+"1-先进先出调度算法 2-基于优先数的调度算法 3-最短执行时间调度算法 其他数字键键-退出"); try{ s=br.readLine(); //接受Ascii码,1的Ascii码为49; }catch(IOException e){}; switch(Integer.parseInt(s)){ case 1: call_FCFS(ready,wait);in=true;break; //调用先进先出算法 case 2: call_PrevSort(ready,wait);in=true;break; //调用基于优先数的调度算法 case 3: call_LessTime(ready,wait);in=true;break; //调用最短执行时间调度算法 default: in=false;System.out.println("退出系统!"); } } } //输出链表内容 static void outPrint(LinkedList<Process> list){ Process temp; if(list.size()>0){ for(int i=0;i<list.size();i++){ temp=list.get(i); System.out.print("第"+(i+1)+"个进程:"+"\t"); temp.print(); } } else System.out.println("空队列"); } //输出所有进程信息 static void process_Print(LinkedList<Process> ready,LinkedList<Process> wait){ System.out.println("\n就绪队列:"); outPrint(ready); System.out.println("等待队列:"); outPrint(wait); } //先进先出调度算法函数 static void call_FCFS(LinkedList<Process> ready,LinkedList<Process> wait){ int time=0; //处理机分配的时间片 Random rd=new Random(); //执行进程 while(ready.size()>0 || wait.size()>0){ process_Print(ready,wait); //输出所有进程信息 time=rd.nextInt(15)+5; //随机产生时间片长度 System.out.println("\n时间片长度: "+time); if(ready.size()>0){ if(ready.get(0).getTime() > time){ //进程执行所需时间大于处理机分配的时间片,执行完时间片长度后 ready.get(0).setTime(ready.get(0).getTime()-time); //该进程随机进入等待或就绪对列,否则该进程执行完毕删除 if(rd.nextInt(2)==0){ //该进程 ready.add(ready.get(0)); System.out.print("进程:"+ready.get(0).getName()+" 时间片不够进入就绪对列队尾。 "); } else{ wait.add(ready.get(0)); System.out.print("进程:"+ready.get(0).getName()+" 时间片不够进入等待对列队尾。 "); } } else System.out.print("进程:"+ready.get(0).getName()+" 执行完毕! "); ready.remove(0); } //在进程执行过程中,产生随机数0或1,该随机数为1时,将等待队列中的第一个PCB加入就绪队列的对尾 if(wait.size()>0){ waittoready(ready,wait); } } System.out.println("\n\n所有进程执行完毕!"); } //基于优先数的调度算法函数 static void call_PrevSort(LinkedList<Process> ready,LinkedList<Process> wait){ int time=0; //处理机分配的时间片 Random rd=new Random(); Process pro_hightsort; while(ready.size()>0 || wait.size()>0){ process_Print(ready,wait); //输出所有进程信息 time=rd.nextInt(15)+5; //随机产生时间片长度 System.out.println("\n时间片长度: "+time); if(ready.size()>0){ pro_hightsort=search_HightSort(ready); //寻找一个优先数最高的进程 System.out.print("进程"+pro_hightsort.getName()+"优先数最高。 "); if(pro_hightsort.getTime() > time){ //进程执行所需时间大于处理机分配的时间片,执行完时间片长度后 pro_hightsort.setTime(pro_hightsort.getTime()-time); //该进程随机进入等待或就绪对列, if(rd.nextInt(2)==0){ //否则该进程执行完毕删除该进程 ready.add(pro_hightsort); System.out.print("进程:"+pro_hightsort.getName()+" 时间片不够进入就绪对列队尾。 "); } else{ wait.add(pro_hightsort); System.out.print("进程:"+pro_hightsort.getName()+" 时间片不够进入等待对列队尾。 "); } } else System.out.print("进程:"+pro_hightsort.getName()+" 执行完毕! "); ready.remove(ready.indexOf(pro_hightsort)); } //在进程执行过程中,产生随机数0或1,该随机数为1时,将等待队列中的第一个PCB加入就绪队列的对尾 if(wait.size()>0){ waittoready(ready,wait); } } System.out.println("\n\n所有进程执行完毕!"); } //最短执行时间调度算法函数 static void call_LessTime(LinkedList<Process> ready,LinkedList<Process> wait){ int time=0; //处理机分配的时间片 Random rd=new Random(); Process pro_lesstime; while(ready.size()>0 || wait.size()>0){ process_Print(ready,wait); //输出所有进程信息 time=rd.nextInt(15)+5; //随机产生时间片长度 System.out.println("\n时间片长度: "+time); if(ready.size()>0){ pro_lesstime=search_LessTime(ready); System.out.print("进程"+pro_lesstime.getName()+"执行时间最短。 "); if(pro_lesstime.getTime() > time){ //进程执行所需时间大于处理机分配的时间片,执行完时间片长度后 pro_lesstime.setTime(pro_lesstime.getTime()-time); //该进程随机进入等待或就绪对列, if(rd.nextInt(2)==0){ //否则该进程执行完毕删除该进程 ready.add(pro_lesstime); System.out.print("进程:"+pro_lesstime.getName()+" 时间片不够进入就绪对列队尾。 "); } else{ wait.add(pro_lesstime); System.out.print("进程:"+pro_lesstime.getName()+" 时间片不够进入等待对列队尾。 "); } } else System.out.print("进程:"+pro_lesstime.getName()+" 执行完毕! "); ready.remove(ready.indexOf(pro_lesstime)); } //在进程执行过程中,产生随机数0或1,该随机数为1时,将等待队列中的第一个PCB加入就绪队列的对尾 if(wait.size()>0){ waittoready(ready,wait); } } System.out.println("\n\n所有进程执行完毕!"); } //在进程执行过程中,产生随机数0或1,该随机数为1时,将等待队列中的第一个PCB加入就绪队列的对尾; static void waittoready(LinkedList<Process> ready,LinkedList<Process> wait){ Random rd=new Random(); if(rd.nextInt(2)==1){ ready.add(wait.get(0)); System.out.println("等待队列第一个进程: "+wait.get(0).getName()+" 进入就绪对列队尾!"); } else{ wait.add(wait.get(0)); System.out.println("等待队列第一个进程: "+wait.get(0).getName()+" 进入等待对列队尾!"); } wait.remove(0); } //寻找一个所需时间最少的进程 static Process search_LessTime(LinkedList<Process> ready){ Process lesstime=ready.get(0); for(int i=1;i<ready.size();i++){ if(lesstime.getTime()>ready.get(i).getTime()) lesstime=ready.get(i); } return lesstime; } //寻找一个优先数最高的进程 static Process search_HightSort(LinkedList<Process> ready){ Process hightsort=ready.get(0); for(int i=1;i<ready.size();i++){ if(hightsort.getSort()<ready.get(i).getSort()) hightsort=ready.get(i); } return hightsort; } }

西西唐文颖啊 LV6
2022年6月9日
hcyhard LV8
2020年11月16日
lironggang LV38
2019年7月9日
chaoshou LV6
2019年3月6日
rew茹6凤 LV6
2018年9月14日
puhuiling LV9
2018年5月8日
15735184511 LV7
2018年1月4日
如来悟空 LV10
2017年12月1日
你高冷 LV12
2017年10月11日
jennyaiai LV21
2017年3月27日

3334004690 LV10
3月8日
张张洁
2024年4月18日
暂无贡献等级
钱小小 LV3
2023年7月16日
卡布琪洛 LV4
2023年5月28日
2978657249
2022年9月4日
暂无贡献等级
crosa_Don LV18
2022年7月19日
annazhang LV29
2022年7月17日
微信网友_6033504264015872
2022年7月6日
暂无贡献等级
糊涂神 LV3
2022年6月21日
Hsy605 LV9
2022年6月20日