java实现先来先服务和短作业优先算法(基础java)

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,如果上述程序有瑕疵,欢迎指正!

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值