[Java教程]进程调度的两种算法JAVA实现

0 2015-10-21 12:00:08

(SJF分为preemptive shortest job first(抢占式)和non-preemptive shortest job first(非抢占式),本位涉及的是后者,前者比后者复杂)

FCFS核心代码如下:1 package me.ares.algorithms; 2 3 import java.util.List; 4 import me.ares.domain.Process; 5 import me.ares.utils.ProcessUtil; 6 7 public class FCFS { 8 private List processes; 9 10 public FCFS(String fileString){11 processes = ProcessUtil.readProcesses(fileString);12 }13 14 public void execute(){15 ProcessUtil.sortByArrivalTime(processes);16 int currentTime = 0;17 for (int i = 0; i < processes.size(); i++) {18 System.out.println("时刻"+currentTime+": 进程"+processes.get(i).getProcessID()+"启动");19 if(processes.get(i).getArrivalTime()>=currentTime){20 processes.get(i).setStartingTime(processes.get(i).getArrivalTime());21 processes.get(i).setFinishingTime(processes.get(i).getStartingTime()+processes.get(i).getServiceTime());22 processes.get(i).setTurnAroundTime(processes.get(i).getFinishingTime()-processes.get(i).getArrivalTime());23 processes.get(i).setAverageTAT((double)processes.get(i).getTurnAroundTime() / processes.get(i).getServiceTime());24 }else {25 processes.get(i).setStartingTime(currentTime);26 processes.get(i).setFinishingTime(processes.get(i).getStartingTime()+processes.get(i).getServiceTime());27 processes.get(i).setTurnAroundTime(processes.get(i).getFinishingTime()-processes.get(i).getArrivalTime());28 processes.get(i).setAverageTAT((double)processes.get(i).getTurnAroundTime() / processes.get(i).getServiceTime());29 }30 currentTime = processes.get(i).getFinishingTime();31 }32 33 System.out.println("---------------------------------------------------------------------");34 35 ProcessUtil.sortByID(processes);36 for(Process p : processes){37 System.out.println(p);38 }39 }40 }

SJF核心代码如下

1 package me.ares.algorithms; 2 3 import java.util.List; 4 import me.ares.domain.Process; 5 import me.ares.utils.ProcessUtil; 6 7 public class SJF { 8 private List processes; 9 10 // 从文件读入模拟进程11 public SJF(String fileString) {12 processes = ProcessUtil.readProcesses(fileString);13 }14 15 public void execute() {16 ProcessUtil.sortByServiceTime(processes);17 int currentTime = 0; //起始时刻18 int next;19 while((next=nextVisit(currentTime))!=-1){20 System.out.println("时刻"+currentTime+": 进程"+processes.get(next).getProcessID()+"启动");21 processes.get(next).setStartingTime(currentTime);22 processes.get(next).setFinishingTime(processes.get(next).getServiceTime()+processes.get(next).getStartingTime());23 processes.get(next).setTurnAroundTime(processes.get(next).getFinishingTime()-processes.get(next).getArrivalTime());24 processes.get(next).setAverageTAT((double)processes.get(next).getTurnAroundTime() / processes.get(next).getServiceTime());25 currentTime = processes.get(next).getFinishingTime();26 }27 System.out.println("---------------------------------------------------------------------");28 ProcessUtil.sortByID(processes);29 for(Process p : processes){30 System.out.println(p);31 }32 }33 34 private int nextVisit(int currentTime) {35 for (int i = 0; i < processes.size(); i++) {36 if (processes.get(i).isVisited() == false && processes.get(i).getArrivalTime() < currentTime) {37 processes.get(i).setVisited(true);38 return i;39 }40 }41 return ProcessUtil.findFirstArrival(processes); //先到达先执行;42 }43 }

模拟Process的对象模型1 package me.ares.domain; 2 3 public class Process { 4 private char processID; 5 private int arrivalTime; //到达时间 6 private int serviceTime; //服务时间 7 private int startingTime; //开始时间 8 private int finishingTime; //完成时间 9 private int turnAroundTime; //周转时间10 private double averageTAT; //带权周转时间11 private boolean visited = false; 12 13 public Process(char processID, int arrivalTime, int serviceTime) {14 super();15 this.processID = processID;16 this.arrivalTime = arrivalTime;17 this.serviceTime = serviceTime;18 }19 20 public char getProcessID() {21 return processID;22 }23 24 public void setProcessID(char processID) {25 this.processID = processID;26 }27 28 public int getArrivalTime() {29 return arrivalTime;30 }31 public void setArrivalTime(int arrivalTime) {32 this.arrivalTime = arrivalTime;33 }34 public int getServiceTime() {35 return serviceTime;36 }37 public void setServiceTime(int serviceTime) {38 this.serviceTime = serviceTime;39 }40 public int getStartingTime() {41 return startingTime;42 }43 public void setStartingTime(int startingTime) {44 this.startingTime = startingTime;45 }46 public int getFinishingTime() {47 return finishingTime;48 }49 public void setFinishingTime(int finishingTime) {50 this.finishingTime = finishingTime;51 }52 public int getTurnAroundTime() {53 return turnAroundTime;54 }55 public void setTurnAroundTime(int turnAroundTime) {56 this.turnAroundTime = turnAroundTime;57 }58 public double getAverageTAT() {59 return averageTAT;60 }61 public void setAverageTAT(double averageTAT) {62 this.averageTAT = averageTAT;63 }64 65 public boolean isVisited() {66 return visited;67 }68 69 public void setVisited(boolean visited) {70 this.visited = visited;71 }72 73 @Override74 public String toString() {75 return "Process [processID=" + processID + ", arrivalTime="76 + arrivalTime + ", serviceTime=" + serviceTime77 + ", startingTime=" + startingTime + ", finishingTime="78 + finishingTime + ", turnAroundTime=" + turnAroundTime79 + ", averageTAT=" + averageTAT 80 + "]";81 }82 83 }

操作Process的便捷工具类1 package me.ares.utils; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 import java.util.ArrayList; 6 import java.util.Comparator; 7 import java.util.List; 8 import java.util.Scanner; 9 10 import me.ares.domain.Process;11 12 public class ProcessUtil {13 14 public static List readProcesses(String fileString){15 List processes = new ArrayList();16 Scanner scanner = null;17 try {18 scanner = new Scanner(new File(fileString));19 while (scanner.hasNext()) {20 char processID = scanner.next().charAt(0);21 int arrivalTime = scanner.nextInt();22 int serviceTime = scanner.nextInt();23 processes.add(new Process(processID, arrivalTime, serviceTime));24 }25 } catch (FileNotFoundException e) {26 e.printStackTrace();27 }28 scanner.close();29 return processes;30 }31 32 public static void sortByServiceTime(List processes) {33 processes.sort(new Comparator() {34 public int compare(Process o1, Process o2) {35 if (o1.getServiceTime() > o2.getServiceTime()) {36 return 1;37 } else if (o1.getServiceTime() == o2.getServiceTime()) {38 return 0;39 } else {40 return -1;41 }42 }43 });44 }45 46 public static void sortByID(List processes) {47 processes.sort(new Comparator(){48 49 @Override50 public int compare(Process o1, Process o2) {51 if (o1.getProcessID()>o2.getProcessID()) {52 return 1;53 }else if (o1.getProcessID() == o2.getProcessID()) {54 return 0;55 }else{56 return -1;57 }58 }59 60 });61 }62 63 public static void sortByArrivalTime(List processes){64 processes.sort(new Comparator() {65 66 @Override67 public int compare(Process o1, Process o2) {68 if(o1.getArrivalTime()>o2.getArrivalTime()) return 1;69 else if (o1.getArrivalTime()==o2.getArrivalTime()) return 0; 70 else return -1;71 }72 });73 }74 75 public static int findFirstArrival(List processes) {76 int firstArrival = Integer.MAX_VALUE;77 int index = -1;78 for (int i = 0; i < processes.size(); i++) {79 if (processes.get(i).isVisited() == false80 && processes.get(i).getArrivalTime() < firstArrival) {81 firstArrival = processes.get(i).getArrivalTime();82 index = i;83 }84 }85 if (index != -1)86 processes.get(index).setVisited(true); // index值改变代表进程被找到,设置进程visited值87 return index;88 }89 90 }

//---------------------------------------------------------测    试    如    下(Junit单元测试)----------------------------------------------------------------------------------------------------1 package me.ares.junittest; 2 3 import me.ares.algorithms.FCFS; 4 import org.junit.Test; 5 6 public class FCFS_Test { 7 8 FCFS fcfs = new FCFS("test.txt"); 9 10 @Test11 public void testExecute() {12 fcfs.execute();13 }14 15 }

package me.ares.junittest;import me.ares.algorithms.SJF;import org.junit.Test;public class SJF_Test { SJF sjf = new SJF("test.txt"); @Test public void testExecute() { sjf.execute(); }}

----------------------------------如有疑惑请留言噢--------------------------

本文网址:http://www.shaoqun.com/a/151554.html

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

JAVA

0

java进程调度怎么画图,[Java教程]进程调度的两种算法JAVA实现相关推荐

  1. java实参将数据传递给形参的两种形式

    java实参将数据传递给形参的两种形式 /*** java实参将数据传递给形参的两种形式* 1,按值传递* 2,按引用传递* * 当参数是基本数据类型时,数据不占用堆内存,按值传递* 当参数是引用类型 ...

  2. java 生成二维码 QRCode、zxing 两种方式

    版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...

  3. java 读取css文件_java文件读取的两种方式

    JAVA中读取文件(二进制,字符)内容的几种方 JAVA中读取文件内容的方法有很多,比如按字节读取文件内容,按字符读取文件内容,按行读取文件内容,随机读取文件内容等方法,本文就以上方法的具体实现给出代 ...

  4. 计算 java_两种计算Java对象大小的方法(转)

    原文:http://blog.csdn.net/iter_zc/article/details/41822719 另一篇类似文章:http://www.cnblogs.com/magialmoon/p ...

  5. Java去除掉HTML里面所有标签的两种方法——开源jar包和自己写正则表达式

    Java去除掉HTML里面所有标签,主要就两种,要么用开源的jar处理,要么就自己写正则表达式.自己写的话,可能处理不全一些自定义的标签.企业应用基本都是能找开源就找开源,实在不行才自己写-- 1,开 ...

  6. 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  7. 聊聊JVM(三)两种计算Java对象大小的方法

    普通对象的结构如下,按64位机器的长度计算 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节 3. 数据区 4.Padding(内存对齐 ...

  8. java web ip_详解Java Web如何限制访问的IP的两种方法

    前一阵子因为在做项目时碰到了这个功能,现在好好总结一下,至于为什么要限制IP访问,我就不多说了.然后百度了一下,现在主要有两种方式去限制IP访问,第一种是最简单的方便的,第二种是通过过滤器来限制访问. ...

  9. 求一个数的二进制中有多少了 1 的三种算法 ——Java篇

    求一个数的二进制中有多少了 1 的三种算法 --Java篇 文章目录 求一个数的二进制中有多少了 1 的三种算法 --Java篇 算法一:通过取模 % 运算就取出每一比特位数值,再判断 思路: 代码: ...

最新文章

  1. 应用监控CAT之cat-client源码阅读(一)
  2. 基于Python的信用评分卡模型分析
  3. CentOS7中多台服务器配置时钟同步
  4. 单高斯分布模型GSM,高斯混合模型GMM
  5. CSS之简单的双引号
  6. golang 微框架 gin
  7. 玩转控件:对Dev中GridControl控件的封装和扩展
  8. ASP.NET Core MVC 控制器创建与依赖注入
  9. Wannafly挑战赛10F-小H和遗迹【Trie,树状数组】
  10. [dp]最长单调递增子序列LIS
  11. 汕头市队赛 SRM16 T2
  12. 【BZOJ3684】大朋友和多叉树(拉格朗日反演)
  13. 【Elasticsearch】es 面试题 积累
  14. 任意给定一个正整数N,求一个最小的正整数M(M1),使得N*M的十进制表示形式里只含有1和0。...
  15. File Converter——万能格式转化神器
  16. Android 资源(resource)学习小结
  17. iOS开发UI篇—无限轮播(循环展示)
  18. delphi 如何解决假死
  19. 存储解决方案之——FC存储解决方案
  20. leetcode 860.柠檬水找零 Java

热门文章

  1. Bootstrap Magic – 轻松创建自己的 Bootstrap 主题
  2. Win7(包括32和64位)使用GitHub
  3. Win 08 子域的搭建(二):父子域和SharePoint Farm
  4. c语言创建树,递归创建二叉树c语言实现+详细解释
  5. html52D转换3D,CSS3 Transform 2D和3D转换
  6. 和为 k 的组合(51Nod-1268)
  7. M斐波那契数列(HDU-4549)
  8. 机器分配(信息学奥赛一本通-T1266)
  9. 国王游戏(洛谷-P1080)
  10. 信息学奥赛一本通C++语言——1109:开关灯