进程调度

ⅰ亾dé卋堺 提交于 2019-11-26 14:36:13

//进程一

public class Process1 {
    public  int name;                //进程ID名
    public  int priority;            //优先权数
    public  int cputime;             //进程需要的时间
    public  String state;             //进程状态
    

    //设置 process类的构造方法


    Process1(int i, int priority , int cputime , String state)
    {
        this.name = i;
        this.priority = priority;
        this.cputime = cputime;
        
        this.state = state;
    }
    public String toString() {
        return "进程名:" + name + "  优先级为:" + priority + "  需要运行的时间:" + cputime + "  进程状态:" + state;
    }
}

//进程二

public class Process2 {
    public int name;
    public int needTime;
    public int ocpTime;
    public String state;
    
    Process2(int i, int needTime , int ocpTime , String state)
    {
        this.name = i;
        this.needTime = needTime;
        this.ocpTime = ocpTime;    
        this.state = state;
    }
    
    public String toString() {
        return "进程名:" + name + "  需要时间片:" + needTime + "  已占用时间片:" + ocpTime + "  进程状态:" + state;
    }

}

//测试类

import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
import java.util.concurrent.ThreadLocalRandom;
import java.util.LinkedList;

public class ProcessTest {
    public static LinkedList<Process1> input1(){
        LinkedList<Process1> l = new LinkedList<Process1>();   
        System.out.println("要创建进程数:");
        Scanner s = new Scanner(System.in);
        int num = s.nextInt();
        for (int i = 1; i <= num; i++) {
            ThreadLocalRandom ran = ThreadLocalRandom.current();
            int a = ran.nextInt(10,20);
            int b = ran.nextInt(1,20);
            Process1 p = new Process1(i,a,b,"ready");  
            l.add(p);
        }    
        s.close();
        return l;
        
    }
    
    
    public static LinkedList<Process2> input2(){
        LinkedList<Process2> l = new LinkedList<Process2>();   
        System.out.println("要创建进程数:");
        Scanner s = new Scanner(System.in);
        int num = s.nextInt();
        for (int i = 1; i <= num; i++) {
            ThreadLocalRandom ran = ThreadLocalRandom.current();
            int a = ran.nextInt(10,20);
            Process2 p = new Process2(i,a,0,"ready");  //
            l.add(p);
        }    
        s.close();
        return l;
        
    }
    
    //比较器
    class PriorityComparator implements Comparator<Process1> {
        public int compare(Process1 p1, Process1 p2) {
            if (p1.priority < p2.priority) {
                return 1;
            } else if (p1.priority > p2.priority) {
                return -1;
            } else {
                return 0;
            }
        }
    }
    public void run1(){
        
        LinkedList<Process1> l = ProcessTest.input1();
        Collections.sort(l, new PriorityComparator());//排序
        
        for(Process1 p:l) {
        System.out.println(p);
        }
        
        System.out.println("===============================");
        
        
        while(!l.isEmpty()) {
            
            l.peek().state = "running";
            
            for(Process1 p:l) {
                System.out.println(p);
                }
            
            l.peek().priority -= 3;
            l.peek().cputime -= 1;
            l.peek().state = "ready";
            
            Collections.sort(l, new PriorityComparator());
                    
            
            System.out.println("===============================");
            
            for(int i = 0;i < l.size();i++) {
                if(l.get(i).cputime<=0) {
                    l.get(i).state = "finish";
                    
                    //System.out.println(l.get(i));
                    System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
                    
                    System.out.println("结束进程:"+l.get(i));
                    
                    System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
                    
                    l.remove(i);
                }
            }            
        }
        
        System.out.println("End");
        
    }
    
    public void run2() {
        LinkedList<Process2> l = ProcessTest.input2();
        for(Process2 p:l) {
            System.out.println(p);
            }
        
        System.out.println("===============================");
        
        while(!l.isEmpty()) {
            l.peek().state = "runnig";
            
            for(Process2 p:l) {
                System.out.println(p);
                }    
            
            l.peek().state = "ready";
            
            l.peek().needTime--;
            l.peek().ocpTime++;
            
            //更改队列元素顺序
            Process2 temp = l.get(0);
            for(int i =0;i < l.size()-1;i++) {
                l.set(i, l.get(i+1));
            }
            l.set(l.size()-1,temp );
            
            
            System.out.println("===============================");
            
            
            for(int i = 0;i < l.size();i++) {
                if(l.get(i).needTime<=0) {
                    l.get(i).state = "finish";
                    
                    //System.out.println(l.get(i));
                    System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
                    
                    System.out.println("结束进程:"+l.get(i));
                    
                    System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
                    
                    l.remove(i);
                }
            }            
        }
        
        System.out.println("END");
        
        
    }

    
    public static void main(String[] args){
        
        ProcessTest pro = new ProcessTest();
        System.out.println("输入“y”或“n”:");
        Scanner s = new Scanner(System.in);
        String cmd = s.next();
        if(cmd.equals("y")) {
            pro.run1();
        }else if(cmd.equals("n")){
            pro.run2();
        }else {
            System.out.println("输入非法,重新运行");
        }
        s.close();
    }

}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!