非抢占式的多级进程调度

  1. 首先新建PCB类;
  2. 其次对进程的到达时间、服务时间进行排序;
  3. 最后创建进程,开始模拟进程调度;
package work;

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.Arrays;
 
 class PCB{
     private int priority = 0;
     private String id;
     private int arriveTime;
     private int runTime;
     public PCB(String id,int arriveTime,int runTime) {
         this.id = id;
         this.arriveTime = arriveTime;
         this.runTime = runTime;
     }

     public void run(int time) {
         runTime -= time;
     }
     public String getId() {
         return this.id;
     }
     public int getArriveTime(){
         return this.arriveTime;
     }
     public int getRunTime() {
         return this.runTime;
     }
 }
 public class OStestdemo {
 
    public static void main(String[] args) throws InterruptedException {
        int[] timelices = {1,2,4};
        List <Queue<PCB>> PriorityQueue = new LinkedList<Queue<PCB>>();
        for(int i = 0;i < timelices.length;i++) {
            Queue<PCB> temp = new LinkedBlockingQueue<PCB>();
            PriorityQueue.add(temp);
        }
        int[][] Time = {{0,8},{1,4},{0,1}};
        Queue<PCB> proce = new LinkedBlockingQueue<PCB>();

        System.out.println(Time.length);
        for (int i = 0;i<Time.length;i++){
        	for (int j=i+1 ;j<Time.length;j++){
        		if(Time[i][0]>Time[j][0]){
        			int tim=Time[i][0];
        			int test=Time[i][1];
        			Time[i][0]=Time[j][0];
        			Time[i][1]=Time[j][1];
        			Time[j][0]=tim;
        			Time[j][1]=test;
        		}
        		else if (Time[i][0]==Time[j][0]){
        			if(Time[i][1]>Time[j][1]){
        				int tim=Time[i][0];
            			int test=Time[i][1];
            			Time[i][0]=Time[j][0];
            			Time[i][1]=Time[j][1];
            			Time[j][0]=tim;
            			Time[j][1]=test;
        			}
        		}
        		
        	}
        }
        for(int i = 0;i<Time.length;i++){
        	System.out.println("[][0]"+Time[i][0]+"[][1]"+Time[i][1]);
        	proce.add(new PCB("P"+i,Time[i][0],Time[i][1]));
        }

        int clock=0;
        while(true) {
            if(!proce.isEmpty()) {
                if(proce.element().getArriveTime() <= clock) {
                    PCB temp =proce.remove();
                    PriorityQueue.get(0).add(temp);
                    System.out.println(temp.getId()+" 到了"+"此时的时刻为: "+clock);
                }
            }
            for(int i=0;i < PriorityQueue.size();i++) {
                if(!PriorityQueue.get(i).isEmpty()) {
                    PCB runPro = PriorityQueue.get(i).remove();
                    System.out.println(runPro.getId()+" 正在执行"+"此时的时刻为: "+clock);
                    if(runPro.getRunTime() > timelices[i]) {
                        runPro.run(timelices[i]);
                        clock += timelices[i];
                        if(i != PriorityQueue.size()-1) {
                            PriorityQueue.get(i+1).add(runPro);
                        }else {
                            PriorityQueue.get(i).add(runPro);
                        }
                        Thread.sleep(1000);
                        
                    }else {
                        clock += runPro.getRunTime();
                        runPro.run(runPro.getRunTime());
                        System.out.println(runPro.getId()+" 执行完毕"+"此时的时刻为: "+clock);
                    }
                    break;
                }
            }
        }
    }
}

运行结果:
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值