java实现先来先服务和短作业优先算法(基础java)
Process.java 进程类,用于存放数据
public class Process{
String name;
double arrTime;// 进程到达时间
double workTime;// 运行时间
double startTime;// 开始服务时间
double FinishTime;// 结束进程时间
double cyclingTime;// 周转时间
//构造函数
public Process(String name, double arrTime, double workTime) {
super();
this.name = name;
this.arrTime = arrTime;
this.workTime = workTime;
finish=false;
}
boolean finish;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getArrTime() {
return arrTime;
}
public void setArrTime(double arrTime) {
this.arrTime = arrTime;
}
public double getWorkTime() {
return workTime;
}
public void setWorkTime(double workTime) {
this.workTime = workTime;
}
public double getStartTime() {
return startTime;
}
public void setStartTime(double startTime) {
this.startTime = startTime;
}
public double getFinishTime() {
return FinishTime;
}
public void setFinishTime(double finishTime) {
FinishTime = finishTime;
}
public double getCyclingTime() {
return cyclingTime;
}
public void setCyclingTime(double cyclingTime) {
this.cyclingTime = cyclingTime;
}
public boolean isFinish() {
return finish;
}
public void setFinish(boolean finish) {
this.finish = finish;
}
}
MyDemo.java 主体类
import java.util.Scanner;
public class MyDemo {
static Process process[];
static int num;
static Scanner in=new Scanner(System.in);
static String start=null;
static String name="";//进程名称
static double arrTime;//进程到达时间
static double workTime;//运行时间
static double startTime;//开始服务时间
static double FinishTime;//结束服务时间
static double cyclingTime;//周转时间
static double AvgcyclingTime;//平均周转时间
static double AvgweightedTime;//平均带权周转时间
static boolean finish=false;//短作业优先算法判断结束
static boolean begin=true;
public static void main(String[] args) {
// TODO 自动生成的方法存根
while (begin) {
System.out.println("***********************************************");
System.out.println(" 欢迎使用先来先服务和短作业优先算法系统 ");
System.out.println(" 输入FCFS使用先来先服务算法 ");
System.out.println(" 输入SJF使用短作业优先算法 ");
System.out.println(" 输入EXIT退出程序 ");
System.out.println("***********************************************");
System.out.println("请输入相关数字或者字母");
start=in.nextLine();
if(start.equals("FCFS")||start.equals("fcfs")) {
//先来先服务
System.out.println("请输入进程数:");
num=in.nextInt();
if(num>0) {
FCFS(num);
begin=true;
}
}
else if(start.equals("SJF")||start.equals("sjf"))
{
//短作业优先
System.out.println("请输入进程数:");
num=in.nextInt();
if(num>0) {
SJF(num);
begin=true;
}
}
else if(start.equals("EXIT")||start.equals("exit")) {
System.out.println("***********************************************");
System.out.println(" 您选择的是退出程序 ");
System.out.println("***********************************************");
begin=false;
}
else {
System.out.println("***********************************************");
System.out.println(" 请输入提示规定的数字或字母 ");
System.out.println("***********************************************");
begin=true;
}
}
}
//寻找最短时间
public static double seacher() {
double compare=10;
for(int j=0;j<5;j++) {
if(process[j].workTime<compare&&process[j].finish!=true) {
compare=process[j].workTime;
}
}
return compare;
}
//先来先服务算法实现
public static void FCFS(int num) {
process=new Process[num];
System.out.println("您选择的是先来先服务");
in.nextLine();//使用nextline方法是要读取到\n的,而上一个读取是数字,因为 nextInt() 接收一个整型字符,不会读取 \n,nextline() 读入一行文本,会读入 \n 字符。不然会导致下面循环中的‘请输入进程名称’功能都赋为\n。
for(int i=0;i<num;i++) {
System.out.println("请输入进程名称:");
name=in.nextLine();
System.out.println("请输入进程到达时间:");
arrTime=Double.valueOf(in.nextLine());
System.out.println("请输入运行时间:");
workTime=Double.valueOf(in.nextLine());
process[i]=new Process(name, arrTime, workTime);
}
System.out.println();
System.out.println("******************************************************************************");
System.out.println("****进程名称 到达时间 工作时间 开始时间 完成时间 周转时间 带权周转时间 *****");
for(int i=0;i<num;i++) {
if(i==0) {//第一个先输出
process[i].startTime=process[i].arrTime;//开始时间
process[i].FinishTime=process[i].arrTime+process[i].workTime;//完成时间
process[i].cyclingTime=process[i].FinishTime-process[i].arrTime;//周转时间
System.out.println("**** "+process[i].name+" "+process[i].arrTime+" "+process[i].workTime+" "+process[i].startTime+" "+process[i].FinishTime+" "+process[i].cyclingTime+" "+process[i].cyclingTime/process[i].workTime);
}
else if(process[i].arrTime>process[i-1].FinishTime) {//考虑到有些进程完成,下一个进程还未到达。
process[i].startTime=process[i].arrTime;//开始时间
process[i].FinishTime=process[i].arrTime+process[i].workTime;//完成时间
process[i].cyclingTime=process[i].FinishTime-process[i].arrTime;//周转时间
}
else {
process[i].startTime=process[i-1].FinishTime;//开始时间
process[i].FinishTime=process[i].startTime+process[i].workTime;//完成时间
process[i].cyclingTime=process[i].FinishTime-process[i].arrTime;//周转时间
System.out.println("**** "+process[i].name+" "+process[i].arrTime+" "+process[i].workTime+" "+process[i].startTime+" "+process[i].FinishTime+" "+process[i].cyclingTime+" "+process[i].cyclingTime/process[i].workTime);
}
}
System.out.println("******************************************************************************");
//计算平均周转时间
double sum1=0.0;
double sum2=0.0;
for(int i=0;i<num;i++) {
sum1+=process[i].cyclingTime;
sum2+=process[i].cyclingTime/process[i].workTime;
}
AvgcyclingTime=sum1/num;
AvgweightedTime=sum2/num;
System.out.println("********************************************");
System.out.println("平均周转时间是"+AvgcyclingTime);
System.out.println("平均带权周转时间是"+AvgweightedTime);
System.out.println("********************************************");
}
//短作业优先算法
public static void SJF(int num) {
process=new Process[num];
System.out.println("您选择的是短作业优先");
System.out.println();
in.nextLine();//同上先来先服务
for(int i=0;i<num;i++) {
System.out.println("请输入进程名称:");
name=in.nextLine();
System.out.println("请输入进程到达时间:");
arrTime=Double.valueOf(in.nextLine());
System.out.println("请输入运行时间:");
workTime=Double.valueOf(in.nextLine());
process[i]=new Process(name, arrTime, workTime);
}
System.out.println("******************************************************************************");
System.out.println("****进程名称 到达时间 工作时间 开始时间 完成时间 周转时间 带权周转时间 *****");
process[0].startTime=process[0].arrTime;//开始时间
process[0].FinishTime=process[0].arrTime+process[0].workTime;//完成时间
process[0].cyclingTime=process[0].FinishTime-process[0].arrTime;//周转时间
process[0].finish=true;
int q=0;
System.out.println("**** "+process[0].name+" "+process[0].arrTime+" "+process[0].workTime+" "+process[0].startTime+" "+process[0].FinishTime+" "+process[0].cyclingTime+" "+process[0].cyclingTime/process[0].workTime);
for(int j=0;j<num-1;j++) {
for(int i=1;i<num;i++) {
if (process[i].workTime==seacher()){
if(process[i].arrTime>process[q].FinishTime) {
process[i].startTime=process[i].arrTime;//开始时间
process[i].FinishTime=process[i].startTime+process[i].workTime;//完成时间
process[i].cyclingTime=process[i].FinishTime-process[i].arrTime;//周转时间
process[i].finish=true;
q=i;
System.out.println("**** "+process[i].name+" "+process[i].arrTime+" "+process[i].workTime+" "+process[i].startTime+" "+process[i].FinishTime+" "+process[i].cyclingTime+" "+process[i].cyclingTime/process[i].workTime);
}
else {
process[i].startTime=process[q].FinishTime;//开始时间
process[i].FinishTime=process[i].startTime+process[i].workTime;//完成时间
process[i].cyclingTime=process[i].FinishTime-process[i].arrTime;//周转时间
process[i].finish=true;
q=i;
System.out.println("**** "+process[i].name+" "+process[i].arrTime+" "+process[i].workTime+" "+process[i].startTime+" "+process[i].FinishTime+" "+process[i].cyclingTime+" "+process[i].cyclingTime/process[i].workTime);
}
}
}
}
System.out.println("******************************************************************************");
double sum1=0.0;
double sum2=0.0;
for(int i=0;i<num;i++) {
sum1+=process[i].cyclingTime;
sum2+=process[i].cyclingTime/process[i].workTime;
}
AvgcyclingTime=sum1/num;
AvgweightedTime=sum2/num;
System.out.println("********************************************");
System.out.println("平均周转时间是"+AvgcyclingTime);
System.out.println("平均带权周转时间是"+AvgweightedTime);
System.out.println("********************************************");
}
}
测试数据:
进程名称,到达时间,工作时间
A 0.0 4.0
B 1.0 3.0
C 2.0 5.0
D 3.0 2.0
E 4.0 4.0
···
关于输入数据后,两算法的其他数据输出
注意:进程C的sjf算法最后的带权周转时间应该是3.20
ps:本人也是初学java,如果上述程序有瑕疵,欢迎指正!