zoukankan      html  css  js  c++  java
  • 进程调度算法之短进程优先(Java)

    进程类:

    	import java.text.ParseException;
    	import java.text.SimpleDateFormat;
    	import java.util.Comparator;
    	import java.util.Date;
    
    	public class Process implements Comparable<Process> {
    	private String mName; //线程名 user
    	private int mState; //0代表就绪 //1代表执行 //2代表阻塞
    	private Date mSubmitTime; //提交时间 user
    	private Date mRunTime; //运行需要时间 user
    	private Date mBeginTime; //开始运行时间
    	private Date mEndTime; //运行结束时间
    	private long  mTurnOverTime; //周转时间
    	private double  mResponseRitio; //响应比
    	
    	SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
    	
    	public Process(String name, String submitTime, String runTime) throws ParseException {
    		
    		this.mName = name;
    		this.mSubmitTime = simpleDateFormat.parse(submitTime);
    		this.mRunTime = simpleDateFormat.parse(runTime);
    	}
    
    	
    	
    	public String getmName() {
    		return mName;
    	}
    	public void setmName(String mName) {
    		this.mName = mName;
    	}
    	
    	
    	public int getmState() {
    		return mState;
    	}
    	public void setmState(int mState) {
    		this.mState = mState;
    	}
    	
    	
    	public Date getmSubmitTime() {
    		return mSubmitTime;
    	}
    	public void setmSubmitTime(Date mSubmitTime) {
    		this.mSubmitTime = mSubmitTime;
    	}
    	
    	
    	public Date getmRunTime() {
    		return mRunTime;
    	}
    	public void setmRunTime(Date mRunTime) {
    		this.mRunTime = mRunTime;
    	}
    	
    	
    	public Date getmBeginTime() {
    		return mBeginTime;
    	}
    	public void setmBeginTime(Date mBeginTime) {
    		this.mBeginTime = mBeginTime;
    	}
    	
    	
    	public Date getmEndTime() {
    		return mEndTime;
    	}
    	public void setmEndTime(Date mEndTime) {
    		this.mEndTime = mEndTime;
    	}
    	
    	
    	public long getmTurnOverTime() {
    		return mTurnOverTime;
    	}
    	public void setmTurnOverTime(long l) {
    		this.mTurnOverTime = l;
    	}
    	
    	
    	public double getmResponseRitio() {
    		return mResponseRitio;
    	}
    	public void setmResponseRitio(double mResponseRitio) {
    		this.mResponseRitio = mResponseRitio;
    	}
    	
    
    	@Override
    	public String toString() {
    		return " 线程名" + this.getmName() + " 状态符" + this.getmState()
    		     + " 提交时间" + simpleDateFormat.format(this.getmSubmitTime())
    		     + " 运行时间" + simpleDateFormat.format(this.getmRunTime())
    		     + " 开始运行时间" + simpleDateFormat.format(this.getmBeginTime())
    		     + " 运行结束时间" + simpleDateFormat.format(this.getmEndTime())
    		     + " 周转时间" + this.getmTurnOverTime()
    	         + " 响应比" + this.getmResponseRitio();
    	}
    	
    	public String toString2() {
    		return " 线程名" + this.getmName() + " 状态符" + this.getmState()
    		     + " 提交时间" + simpleDateFormat.format(this.getmSubmitTime())
    		     + " 运行时间" + simpleDateFormat.format(this.getmRunTime())
    		     + " 开始运行时间" + this.getmBeginTime()
    		     + " 运行结束时间" + this.getmEndTime()
    		     + " 周转时间" + this.getmTurnOverTime()
    	         + " 响应比" + this.getmResponseRitio();
    	}
    
    
    	@Override
    	public int compareTo(Process o) {
    		// TODO Auto-generated method stub
    		
    		int y = (int) (o.mSubmitTime.getTime()/1000 + 8 * 60 * 60);
    		int x = (int) (this.mSubmitTime.getTime()/1000 + 8 * 60 * 60);
    		if (x != y) {
    			return (int)(x - y);
    			
    		}
    	    else {
    			return (int) ((this.mRunTime.getTime()/1000 + 8 * 60 * 60)
    					- (o.mRunTime.getTime()/1000 + 8 * 60 * 60));
    		}
    		
    	}
    	
    	}
    
    	//先按照提交时间排序,再按照运行时间排序
    	class sortByAll implements Comparator<Process>{
    
    	@Override
    	public int compare(Process o1, Process o2) {
    		int y = (int) (o2.getmSubmitTime().getTime()/1000 + 8 * 60 * 60);
    		int x = (int) (o1.getmSubmitTime().getTime()/1000 + 8 * 60 * 60);
    		if (x != y) {
    			return (int)(x - y);
    			
    		}
    	    else {
    			return (int) ((o1.getmRunTime().getTime()/1000 + 8 * 60 * 60)
    					- (o2.getmRunTime().getTime()/1000 + 8 * 60 * 60));
    		}
    	}
    	
    	}
    
    	class sortBymRunTime implements Comparator<Process>{
    
    	@Override
    	public int compare(Process o1, Process o2) {
    		
    		return (int) ((o1.getmRunTime().getTime()/1000 + 8 * 60 * 60)
    				- (o2.getmRunTime().getTime()/1000 + 8 * 60 * 60));
    	}
    	
    	}
    

    调度算法类:

    import java.text.ParseException;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Date;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Scanner;
    
    public class ShortRuntime {
    
    	private static String threadName;
    	private static String threadSubmitTime;
    	private static String threadRunTime;
    	private static Date now; //记录当前时间
    	private static int i = 2;
    	
    	public static void main(String[] args) throws ParseException {
    
    		//创建线程对象的集合		
    		List<Process> list = new ArrayList<>();
    				
    		//手动输入太麻烦了,先自己创建几个对象调试程序
    		list.add(new Process("Process1", "00:00:00", "00:02:20"));
    		list.add(new Process("Process2", "00:02:01", "00:03:20"));
    		list.add(new Process("Process3", "00:02:01", "00:00:20"));
    		list.add(new Process("Process4", "00:03:01", "00:01:20"));
    		list.add(new Process("Process5", "00:04:01", "00:00:50"));
    		list.add(new Process("Process6", "00:04:01", "00:00:20"));
    		list.add(new Process("Process7", "00:04:01", "00:10:50"));
    		list.add(new Process("Process8", "00:04:01", "00:10:50"));
    		list.add(new Process("Process9", "00:04:01", "00:00:50"));
    		list.add(new Process("Process10", "00:04:01", "00:01:50"));
    		list.add(new Process("Process11", "00:04:01", "00:22:50"));
    		list.add(new Process("Process12", "00:04:01", "01:00:50"));
    		startUp(list);
    
    	}
    	
    	//最开始的时候先比较提交时间,在提交时间相同的情况下比较运行时间长短
    	//程序开始运行后,只要提交时间小于当前时间的进程,按运行时间长短执行
    	public static void startUp(List<Process> list) throws ParseException {
    		int flag = 0;
    		now = new Date(-8 * 60 * 60 * 1000);
    		System.out.println(now);
    		Collections.sort(list);
    		list.get(0).setmState(1);
    		list.get(0).setmBeginTime(list.get(0).getmSubmitTime());
    		list.get(0).setmEndTime(new Date(((list.get(0).getmBeginTime().getTime()/1000 + 8 * 60 * 60) 
    				+ (list.get(0).getmRunTime().getTime()/1000)) * 1000)); //我也不知为什么要这么写,简直是够了
    		list.get(0).setmTurnOverTime((list.get(0).getmRunTime().getTime())/1000 + 8 * 60 * 60);
    		list.get(0).setmResponseRitio(1);
    		System.out.println("第1次执行进程:");
    		System.out.println(list.get(0).toString());
    		
    		for (Process process : list) {
    		    if(process.getmState() != 1) {
    			System.out.println(process.toString2());
    		    }
    		}
    		now = new Date(now.getTime() + list.get(0).getmRunTime().getTime() + 8 * 60 * 60 * 1000);
    		//System.out.println(now);
    		//当第一个进程执行完毕之后,移除执行完毕的进程,并询问是否要添加新的进程
    		list.remove(0);
    		System.out.println("是否要添加新的进程,如果是请输入1,否请输入0");
    		Scanner scanner = new Scanner(System.in);
            flag = scanner.nextInt();
    		if (flag == 1) {
    			addProcess(list);
    		}
    		else {
    			execute(list);
    		}
    			
    	}
    	
    	public static void addProcess(List<Process> list) throws ParseException {
    		int total = 0;
    		
    		System.out.println("请按如下格式输入线程名,线程提交时间,需要运行时间。 "
    	    	+ "Example: Process1, 09:13:01, 11:00:20");
    		System.out.println("请输入需要创建线程个数");
    		Scanner scanner = new Scanner(System.in);
    		        total = scanner.nextInt();
    		
    		for (int i = 0; i < total; i++) {
    		//读取信息
    		System.out.println("请输入线程名");
    		threadName = scanner.next();
    		System.out.println("请输入线程提交时间(提交时间必须大于当前时间)");
    		threadSubmitTime = scanner.next();
    		System.out.println("请输入需要运行时间");
    		threadRunTime = scanner.next();
    
    		Process process = new Process(threadName, threadSubmitTime, threadRunTime);
    		list.add(process);
    	  }
    		Collections.sort(list);
    		execute(list);
    	}
    	
    	public static void execute(List<Process> list) throws ParseException {
            while (list.isEmpty()) {
    			System.out.println("进程已经执行完毕");
    			System.exit(0);
    		}
    		double res = 0;//响应比
            int flag = 0;
    		List<Process> newList = new ArrayList<>();
    		
    		for (Process process : list) {		
    		if((process.getmSubmitTime().getTime() + 28800000) < (now.getTime() + 28800000)) {
    		   newList.add(process);
    		}
    	 }
    		//System.out.println(list.get(0).getmSubmitTime().getTime() + 28800000);
    		Collections.sort(newList, new sortBymRunTime());
    		newList.get(0).setmState(1);
    		
    		newList.get(0).setmBeginTime(now);
    		
    		newList.get(0).setmEndTime(new Date(((now.getTime()/1000 + 8 * 60 * 60) 
    				+ (newList.get(0).getmRunTime().getTime()/1000)) * 1000)); //我也不知为什么要这么写,简直是够了		
    		
    		newList.get(0).setmTurnOverTime(newList.get(0).getmEndTime().getTime()/1000 
    				- newList.get(0).getmSubmitTime().getTime()/1000);
    		
    		res = (double) (newList.get(0).getmTurnOverTime()/(double)(newList.get(0).getmRunTime().getTime()/1000 + 28800));
    		now = new Date(newList.get(0).getmEndTime().getTime());
    		newList.get(0).setmResponseRitio(res);
    		
    		
    		System.out.println("第" + i + "执行进程:");
    		i++;
    		
    		System.out.println(newList.get(0).toString());
    		
    		String name = newList.get(0).getmName();
    		Iterator<Process> iterator = list.iterator();
    		while (iterator.hasNext()) {
    			Process process = (Process) iterator.next();
    			if (process.getmName() == name) {
    				iterator.remove();
    			}
    		}
    		
    		System.out.println("是否要添加新的进程,如果是请输入1,否请输入0");
    		Scanner scanner = new Scanner(System.in);
            flag = scanner.nextInt();
    		if (flag == 1) {
    			addProcess(list);
    		}
    		else {
    			execute(list);
    		}
    		
    	}
    	
    }
    

    感觉自己写的有点复杂了,直接用String的二维数组会不会简单一些,接下来还要写一个关于进程调度的算法,就用它试试了。

    附上运行结果:

  • 相关阅读:
    python
    python
    打开python自带IDLE出的问题
    Python GUI编程(Tkinter)8、CheckButton多选框控件
    Python GUI编程(Tkinter)7、带滚动条的Text
    Python GUI编程(Tkinter)6、Text控件
    Python GUI编程(Tkinter)5、点击按钮输出输入框中的内容
    Python GUI编程(Tkinter)4、Entry控件
    Python GUI编程(Tkinter)3、Button控件
    Python GUI编程(Tkinter)2、Label控件
  • 原文地址:https://www.cnblogs.com/DevLegal/p/9023194.html
Copyright © 2011-2022 走看看