进程调度优先级JAVA_进程调度算法之短进程优先(Java)

该博客介绍了如何使用Java实现短进程优先(SPF)调度算法。通过定义Process类来存储进程信息,并实现了Comparator接口进行进程的提交时间和运行时间排序。在调度算法类中,先按照提交时间排序,然后在提交时间相同的情况下根据运行时间进行调度。
摘要由CSDN通过智能技术生成

进程类:

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Comparator;

import java.util.Date;

public class Process implements Comparable {

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{

@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{

@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 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 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 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 list) throws ParseException {

while (list.isEmpty()) {

System.out.println("进程已经执行完毕");

System.exit(0);

}

double res = 0;//响应比

int flag = 0;

List 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 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的二维数组会不会简单一些,接下来还要写一个关于进程调度的算法,就用它试试了。

附上运行结果:

1f578278545c02df1d701cfd39956927.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值