代码:
public class JobControlBlock{
float time_Sever;//服务时间
float time_Arrive;//到达时间
float time_Start;//开始时间
float time_Finish;//完成时间
float time_Turnover;//周转时间
float time_WeightedTurnover;//带权周转时间
public JobControlBlock(){
}
public JobControlBlock(float time_Sever,float time_Arrive){
this.time_Sever=time_Sever;
this.time_Arrive=time_Arrive;
}//传服务时间,到达时间
public void set_time_Start(float time_Start){
this.time_Start=time_Start;
}//设置开始时间
public float get_time_Start(){
return time_Start;
}
public void set_time_Arrive(float time_Arrive){
this.time_Arrive=time_Arrive;
}//设置到达时间
public float get_time_Arrive(){
return time_Arrive;
}
public void set_time_Finish(){
time_Finish=time_Start+time_Sever;
}//设置结束时间
public float get_time_Finish(){
return time_Finish;
}
public void set_time_Turnover(){
time_Turnover=time_Finish-time_Arrive;
}//计算周转时间
public float get_time_Turnover() {
return time_Turnover;
}
public void set_time_WeightedTurnover(){
time_WeightedTurnover=time_Turnover/time_Sever;
}//计算带权周转时间
public float get_time_WeightedTurnover(){
return time_WeightedTurnover;
}
}
/*----------------------------------------------------------------------------------------------------------*/
public class Process {
String Process_Name;
JobControlBlock jbc;
Process(){
}
Process(String name,JobControlBlock jbc){
this.Process_Name=name;
this.jbc=jbc;
}//传进程名,分配JBC
}
/*----------------------------------------------------------------------------------------------------------*/
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
//确定进程数
Scanner sc = new Scanner(System.in);
System.out.println("请输入进程数:");
int n = sc.nextInt();
Process PList1[]=new Process[n];
for(int i=0;i<PList1.length;i++){
if(i==0){
System.out.println("请按顺序输入第"+(i+1)+"个进程的名字、服务时间、到达时间并用空格隔开:");
PList1[i]=new Process(sc.next(),new JobControlBlock(sc.nextFloat(), sc.nextFloat()));
//按顺序设定开始时间、结束时间、周转时间、带权周转时间
float time_Start=PList1[i].jbc.time_Arrive;//设置开始时间
PList1[i].jbc.set_time_Start(time_Start);
PList1[i].jbc.set_time_Finish();
PList1[i].jbc.set_time_Turnover();
PList1[i].jbc.set_time_WeightedTurnover();
//设定下一个进程的开始时间
time_Start+=PList1[i].jbc.time_Sever;
}
else {
float time_Start=PList1[0].jbc.time_Finish;//设置开始时间
System.out.println("请按顺序输入第"+(i+1)+"个进程的名字、服务时间、到达时间并用空格隔开:");
PList1[i]=new Process(sc.next(),new JobControlBlock(sc.nextFloat(),sc.nextFloat()));
PList1[i].jbc.set_time_Start(time_Start);
PList1[i].jbc.set_time_Finish();
PList1[i].jbc.set_time_Turnover();
PList1[i].jbc.set_time_WeightedTurnover();
//设定下一个进程的开始时间
time_Start+=PList1[i].jbc.time_Sever;
}
}//创建进程
System.out.println("--------FCFS算法--------顺序:");
for(int i=0;i<PList1.length;i++){
System.out.println(
"进程名:"+PList1[i].Process_Name
+" 到达时间:"+PList1[i].jbc.time_Arrive
+" 服务时间:"+PList1[i].jbc.time_Sever
+" 开始时间:"+PList1[i].jbc.time_Start
+" 结束时间:"+PList1[i].jbc.time_Finish
+" 周转时间:"+PList1[i].jbc.time_Turnover
+" 带权周转时间"+PList1[i].jbc.time_WeightedTurnover);
}//按顺序输出(先到先服务)
float time_Start2=PList1[0].jbc.time_Arrive;//SJF算法中到达时间最小的那个作业的到达时间就是开始时间
Process leap=new Process();
for(int i=1;i<PList1.length;i++){
for(int j=i+1;j<PList1.length;j++){
if(PList1[j].jbc.time_Sever<PList1[i].jbc.time_Sever){
leap=PList1[i];
PList1[i]=PList1[j];
PList1[j]=leap;
}
}
}//交换排序法使数组按服务时间的升序排列
for(int i=0;i<PList1.length;i++){
PList1[i].jbc.set_time_Start(time_Start2);
PList1[i].jbc.set_time_Finish();
PList1[i].jbc.set_time_Turnover();
PList1[i].jbc.set_time_WeightedTurnover();
time_Start2+=PList1[i].jbc.time_Sever;
}//为SJF算法求值
System.out.println("--------SJF算法--------");
for(int i=0;i<PList1.length;i++){
System.out.println(
"进程名:"+PList1[i].Process_Name
+" 到达时间:"+PList1[i].jbc.time_Arrive
+" 服务时间:"+PList1[i].jbc.time_Sever
+" 开始时间:"+PList1[i].jbc.time_Start
+" 结束时间:"+PList1[i].jbc.time_Finish
+" 周转时间:"+PList1[i].jbc.time_Turnover
+" 带权周转时间"+PList1[i].jbc.time_WeightedTurnover);
}//按顺序输出(短则优先)
}
}
可以参照这个表格录入
注:
因为是模拟算法,并不代表实际的过程。所以将作业都放置到数组中,FCFS是按输入顺序排列;SJF是在前者确定的数组中除去第一个作业按服务时间排序。
但在短则优先算法中,由于是事先录好的数组,可能会出现后备队列中有到达时间大于第一个作业结束时间的作业(但它的服务时间却是最小),这样就会出现周转时间为负的情况,这显然是错误的。所以此数组中除去第一个作业外,所有的作业到达时间均不能大于第一个作业的结束时间。实际上,进入后备队列的作业,他们的到达时间都不会大于上一个作业的结束时间。