抢占式调度算法代码java,非抢占式,短作业优先调度算法 | Java语言实现

1 package com.company.osExperiment.algorithm;

2

3 import com.company.osExperiment.entity.PCB;

4

5 import java.util.ArrayList;

6 import java.util.List;

7 import java.util.Scanner;

8

9 import static com.company.osExperiment.entity.PCB.R;

10 import static com.company.osExperiment.util.ResultUtil.addResult;

11

12 /**

13 * 非抢占式,短作业优先调度算法

14 * @Author swsbty

15 * @Date 2020/6/9 4:31

16 */

17

18 public class SJF {

19

20 private int current = 0; // 记录系统当前时间的变量

21 private List processList;

22

23 /*

24 启动方法

25 */

26 public void start() {

27 processList = new ArrayList<>();

28 System.out.println("time 1=1000 time slice");

29 addResult("time 1=1000 time slice");

30 inputProcess();

31 sort();

32 run();

33 }

34

35 /*

36 执行调度算法

37 */

38 private void run() {

39 while (true) {

40 if (processList.size() == 0) { // 如果所有进程都执行完毕,就终止循环

41 return;

42 }

43 runProcess();

44 }

45 }

46

47 /*

48 运行进程

49 */

50 private void runProcess() {

51 for (PCB pcb : processList) {

52 if (pcb.state == R && pcb.arriveTime <= current) { // 如果进程没有执行完毕,同时到达时间小于等于当前时间

53 System.out.println("当前时间:" + (current * 1000) + ",进程" + pcb.name + " 开始运行");

54 addResult("当前时间:" + (current * 1000) + ",进程" + pcb.name + " 开始运行");

55 current += pcb.runtime; // 当前时间加上运行时间

56 System.out.println("当前时间:" + (current * 1000) + ",进程" + pcb.name + " 运行结束");

57 addResult("当前时间:" + (current * 1000) + ",进程" + pcb.name + " 运行结束");

58 processList.remove(pcb); // 删除该进程

59 break;

60 }

61 }

62 }

63

64 /*

65 录入进程

66 */

67 private void inputProcess() {

68 int num; // 要建立的进程数

69 System.out.print("你想运行多少个进程:");

70 addResult("你想运行多少个进程:");

71

72 Scanner input = new Scanner(System.in);

73 num = input.nextInt();

74 addResult("" + num);

75 for (int i = 0;i < num;i++) {

76 PCB p = new PCB();

77 System.out.print(String.format("请输入第 %3d 个进程的名字:", i + 1));

78 addResult(String.format("请输入第 %3d 个进程的名字:", i + 1));

79 p.name = input.next();

80 addResult(p.name);

81

82 System.out.print(" 运行时间:");

83 addResult(" 运行时间:");

84 p.runtime = input.nextInt();

85 addResult("" + p.runtime);

86

87 System.out.print(" 到达时间:");

88 addResult(" 到达时间:");

89 p.arriveTime = input.nextInt();

90 addResult("" + p.arriveTime);

91

92

93 p.state = R;

94 processList.add(p);

95 }

96 }

97

98 /*

99 ☆选择排序

100 该算法把录入的进程,按照运行时间,由小到大排序

101 */

102 private void sort() {

103 for (int i = 0;i < processList.size() - 1;i++) {

104 for (int j = i + 1;j < processList.size();j++) {

105 if (processList.get(i).runtime > processList.get(j).runtime) {

106 PCB pi = processList.get(i);

107 PCB pj = processList.get(j);

108 processList.set(i, pj);

109 processList.set(j, pi);

110 }

111 }

112 }

113 }

114 }

来源:https://www.cnblogs.com/swsbty/p/13070136.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值