java 进程先来先服务代码,Java实现进程调度算法(一) FCFS(先来先服务)

c4468b3f4df77e96b0a416fa2a870fba.png

一、概述

因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示。

也因为我这次要实现多个类似算法,所以将一些共性单独提取出来作为一个类。

如果只想要和算法有关的核心代码,看FCFS类的calc()即可。

实现思路:按照顺序将进程添加到列表中,然后再按照添加顺序运行。模拟进程的运行,即为按顺序改变每个进程的到达时间、服务时间、开始时间、等待时间、周转时间和带权周转时间。在所有进程都结束后再计算平均周转时间和平均带权周转时间。

三、测试

1. 测试数据:

10b86f433a19da1d7e8c6d808a061ec9.png

2. 运行结果:

3ab79868c6f2d0b7b5fe64713f1dafc9.png

三、流程图

0d4e2cc129383a6a4e7ec60254340e00.png

四、实现代码

1. FCFS类(主类)

只有calc()中涉及了算法,init()和printResult()只有简单的输入输出操作。

1 packagexqy.algorithm;2

3 importjava.util.ArrayList;4 importjava.util.Scanner;5

6 importxqy.Util.Tools;7 importxqy.been.Process;8

9 /**

10 *@authorxqy11 * @date 2018年12月19日19:15:0112 * @description 对先到的任务先处理,后到的任务后处理。13 */

14

15 public classFCFS {16 private intprocessNumber;17 private ArrayListprocessList;18

19 publicFCFS() {20 init();21 calc();22 Tools.printResult(processList);23 }24

25 private voidinit() {26 Scanner sc = newScanner(System.in);27

28 System.out.print(" Please enter the process num:");29 processNumber =sc.nextInt();30

31 processList = new ArrayList();32 for (int i = 0; i < processNumber; i++) {33 processList.add(newProcess());34 }35

36 System.out.println(" Please enter each process arrival time:");37 for (int i = 0; i < processNumber; i++) {38 System.out.print(" Process" + (i + 1) + ":");39 processList.get(i).setArrivalTime(sc.nextInt());40 }41

42 System.out.println(" Please enter each process service time:");43 for (int i = 0; i < processNumber; i++) {44 System.out.print(" Process" + (i + 1) + ":");45 processList.get(i).setServicesTime(sc.nextInt());46 }47 }48

49 private voidcalc() {50 int timeNow = 0;51 Process opProcess;52

53 for (int i = 0; i < processNumber; i++) {54 opProcess =processList.get(i);55

56 int waitTime = timeNow -opProcess.getArrivalTime();57 int completionTime = timeNow +opProcess.getServicesTime();58 int turnAroundTime =completionTime59 -opProcess.getArrivalTime();60 double turnAroundTimeWithWeight = (double) turnAroundTime61 /opProcess.getServicesTime();62

63 opProcess.setStartTime(timeNow);64 opProcess.setWaitTime(waitTime);65 opProcess.setCompletionTime(completionTime);66 opProcess.setTurnAroundTime(turnAroundTime);67 opProcess.setTurnAroundTimeWithWeight(68 turnAroundTimeWithWeight);69

70 timeNow +=opProcess.getServicesTime();71 }72 }73

74 public static voidmain(String [] args) {75 newFCFS();76 }77 }

2. Process类

模拟了进程,对属性进行了封装。

1 packagexqy.been;2

3 public classProcess {4 private intarrivalTime;5 private intservicesTime;6 private intremainServiceTime;7 private intstartTime;8 private intwaitTime;9 private intcompletionTime;10

11 /**

12 * turnAroundTime = completionTime - arrivalTime13 */

14 private intturnAroundTime;15

16 /**

17 * turnAroundTimeWithWeight = turnAroundTime / servicesTime18 */

19 private doubleturnAroundTimeWithWeight;20

21 publicProcess() {22 ;23 }24

25 public intgetArrivalTime() {26 returnarrivalTime;27 }28

29 public void setArrivalTime(intarrivalTime) {30 this.arrivalTime =arrivalTime;31 }32

33 public intgetServicesTime() {34 returnservicesTime;35 }36

37 public void setServicesTime(intservicesTime) {38 this.servicesTime =servicesTime;39 }40

41 public intgetRemainServiceTime() {42 returnremainServiceTime;43 }44

45 public void setRemainServiceTime(intremainServiceTime) {46 this.remainServiceTime =remainServiceTime;47 }48

49 public intgetStartTime() {50 returnstartTime;51 }52

53 public void setStartTime(intstartTime) {54 this.startTime =startTime;55 }56

57 public intgetWaitTime() {58 returnwaitTime;59 }60

61 public void setWaitTime(intwaitTime) {62 this.waitTime =waitTime;63 }64

65 public intgetCompletionTime() {66 returncompletionTime;67 }68

69 public void setCompletionTime(intcompletionTime) {70 this.completionTime =completionTime;71 }72

73 public intgetTurnAroundTime() {74 returnturnAroundTime;75 }76

77 public void setTurnAroundTime(intturnAroundTime) {78 this.turnAroundTime =turnAroundTime;79 }80

81 public doublegetTurnAroundTimeWithWeight() {82 returnturnAroundTimeWithWeight;83 }84

85 public void setTurnAroundTimeWithWeight(doubleturnAroundTimeWithWeight) {86 this.turnAroundTimeWithWeight =turnAroundTimeWithWeight;87 }88

89 @Override90 publicString toString() {91 return "Process [arrivalTime=" + arrivalTime + ", servicesTime="

92 + servicesTime + ", remainServiceTime=" +remainServiceTime93 + ", startTime=" + startTime + ", waitTime=" +waitTime94 + ", completionTime=" + completionTime + ", turnAroundTime="

95 + turnAroundTime + ", turnAroundTimeWithWeight="

96 + turnAroundTimeWithWeight + "]";97 }98 }

3. Tools类

因为这次要实现几个类似的算法,所以我把每个算法中都要用到的方法都提取出来作为单独的工具类。

也可以将这些工具方法都放入FCFS类中。

1 packagexqy.Util;2

3 importjava.util.ArrayList;4

5 importxqy.been.Process;6

7 public classTools {8

9 public static doublecalcAverageTurnAroundTime(10 ArrayListprocessList) {11 double sum = 0;12 for (int i = 0; i < processList.size(); i++) {13 sum +=processList.get(i).getTurnAroundTime();14 }15 return Math.round(sum / processList.size() * 100) / 100.0;16 }17

18 public static doublecalcAverageTurnAroundTimeWithWeight(19 ArrayListprocessList) {20 double sum = 0;21 for (int i = 0; i < processList.size(); i++) {22 sum +=processList.get(i).getTurnAroundTimeWithWeight();23 }24 return Math.round(sum / processList.size() * 100) / 100.0;25 }26

27 public static void printResult(ArrayListprocessList) {28 System.out.println("\n #RESULT#");29

30 System.out.print("\tArrive:\t\t");31 for (int i = 0; i < processList.size(); i++) {32 System.out.print(processList.get(i).getArrivalTime() + "\t");33 }34 System.out.println();35

36 System.out.print("\tService:\t");37 for (int i = 0; i < processList.size(); i++) {38 System.out.print(processList.get(i).getServicesTime() + "\t");39 }40 System.out.println();41

42 System.out.print("\tStart:\t\t");43 for (int i = 0; i < processList.size(); i++) {44 System.out.print(processList.get(i).getStartTime() + "\t");45 }46 System.out.println();47

48 System.out.print("\tWait:\t\t");49 for (int i = 0; i < processList.size(); i++) {50 System.out.print(processList.get(i).getWaitTime() + "\t");51 }52 System.out.println();53

54 System.out.print("\tFinish:\t\t");55 for (int i = 0; i < processList.size(); i++) {56 System.out.print(processList.get(i).getCompletionTime() + "\t");57 }58 System.out.println();59

60 System.out.print("\tTurn around:\t");61 for (int i = 0; i < processList.size(); i++) {62 System.out.print(processList.get(i).getTurnAroundTime() + "\t");63 }64 System.out.println();65

66 System.out.print("\tTA wight:\t");67 for (int i = 0; i < processList.size(); i++) {68 System.out.print(Math.round(processList.get(i)69 .getTurnAroundTimeWithWeight() * 100) / 100.0 + "\t");70 }71 System.out.println();72

73 System.out.println("\tAverage turn around time:"

74 + Tools.calcAverageTurnAroundTime(processList) + "\t");75 System.out.println("\tAverage turn around time with wight:"

76 +Tools.calcAverageTurnAroundTimeWithWeight(processList));77

78 System.out.println();79 }80 }

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值