import java.util.*;

/**

* Created by Lairai on 2018/1/14.

*/

public class Schedule {

private final static String SEPERATOR = "*****************************";

/*调度算法*/

private final static int FCFS = 1;

private final static int SJF = 2;

/*内存区总大小*/

private static int size;

/*预先输入的所有作业,按进入时间排序*/

private List jobList;

int newestJobIndex = 0;

/*作业队列, 列表*/

private Queue waitingQueue;

private Queue loadedQueue;

private Job currentExecutingJob;

private Queue scheduleOrderQueue;

/*空闲区链表头*/

private Node head;

/*系统时间*/

private Time systemTime;

public Schedule(int size, int algorithm) {

this.size = size;

jobList = new ArrayList<>();

if (algorithm == FCFS) {

waitingQueue = new ArrayDeque<>();

loadedQueue = new ArrayDeque<>();

} else {

waitingQueue = new PriorityQueue<>((x, y) -> {

return x.getErt() - y.getErt();

});

loadedQueue = new PriorityQueue<>((x, y) -> {

return x.getErt() - y.getErt();

});

} /*短作业优先的情况下使用小顶堆*/

promptInput();//提示用户输入作业信息,初始化JobList

/*系统时间初始化为第一个作业的提交时间*/

Time startTime = jobList.get(0).getEt();

systemTime = new Time(startTime.getHour(), startTime.getMinute());

currentExecutingJob = null;

scheduleOrderQueue = new ArrayDeque<>();

head = new Node(0, size, new Node(0, size, null));

}

public void work() {

while (true) {

checkNewJob();

/*所有作业执行完毕后结束此次调度*/

if (newestJobIndex == jobList.size() && currentExecutingJob == null) break;

/*如果当前没有作业在执行*/

if (currentExecutingJob == null) {

if (!loadedQueue.isEmpty()) {

currentExecutingJob = pickJobFromMemory();

} else {

systemTime.increaseByMinute();

continue;//处理机等待一分钟

}

}

executeCurrentJob();

}

}

/*添加当前时刻提交的所有作业到等待列表*/

private void checkNewJob() {

while (true) {

if (newestJobIndex == jobList.size()) break;

Job job = jobList.get(newestJobIndex);

/*如果当前时刻有新作业提交*/

if (job.getEt().equals(systemTime)) {

++newestJobIndex;

Node space = enoughSpace(job);

/*如果能装入内存则使其装入内存*/

if (space != null) {

allocateMemory(space, job.getNc());

loadedQueue.add(job);

}

/*否则装入等待队列*/

else waitingQueue.add(job);

} else break;

}

}

/**

* 提示用户输入作业信息

*/

private void promptInput() {

System.out.println("Input Job formatted as \"A(job name),8:06(entry time),42(expected runnning time),15(needed capacity in MB)\"");

System.out.println("Input \'#\' to end input");

Scanner scanner = new Scanner(System.in);

String line;

while (true) {

line = scanner.nextLine();

if ("#".equals(line)) break;

else jobList.add(getJob(line));

}

scanner.close();

}

/**

* 根据字符串构造出一个作业

*/

private Job getJob(String s) {

String[] parameters = s.split(",");

if (parameters.length != 4) return null;

String[] time = parameters[1].split(":");

return new Job(parameters[0], Integer.parseInt(time[0]), Integer.parseInt(time[1]), Integer.parseInt(parameters[2]), Integer.parseInt(parameters[3]));

}

/**

* @return 指向能容纳x的空闲区的结点

*/

private Node enoughSpace(Job x) {

if (x == null || head.freeSize < x.getNc()) return null;

else {

int len = x.getNc();

Node p = head;

while (p.next != null) {

if (p.next.freeSize >= len) {

x.setIa(p.next.initialAddress);

return p;

}

p = p.next;

}

return null;

}

}

/**

* 为新进入内存的作业分配空间

* @param p 分配区间的前驱结点

* @param len 所分配的长度

*/

private void allocateMemory(Node p, int len) {

if (p.next.freeSize > len) {

p.next.freeSize -= len;

p.next.initialAddress += len;

} else {

p.next = p.next.next;

}

head.freeSize -= len;

}

/*从装入内存的作业里调度一个可以投入运行的作业*/

private Job pickJobFromMemory() {

Job job = loadedQueue.poll();

if (job != null) {

job.setSt(new Time(systemTime.getHour(), systemTime.getMinute()));

System.out.println("On job " + job.getName() + " gets scheduled at " + systemTime + ", partition state: " + partitionState());

scheduleOrderQueue.add(job);

}

return job;

}

/*尽可能的从等待队列里往内存载入作业*/

private void loadFromWaitingQueue() {

Iterator iterator = waitingQueue.iterator();

while (iterator.hasNext()) {

Job job = iterator.next();

Node space = enoughSpace(job);

if (space != null) {

loadedQueue.add(job);

allocateMemory(space, job.getNc());

iterator.remove();

}

}

}

private String partitionState() {

Node p, q;

p = head.next;

StringBuffer buffer = new StringBuffer(100);

buffer.append("Free Partition: ");

while (p != null) {

buffer.append(" [" + p.initialAddress + ", "

+ (p.initialAddress + p.freeSize - 1) + "]");

p = p.next;

}

return buffer.toString();

}

private void reclaimMemory(Job job) {

Node front = head, back = front.next;

int ia = job.getIa();

Node j = new Node(ia, job.getNc(), null);

while (front != null) {

if (front.initialAddress <= ia && (back == null || back.initialAddress >= ia)) {

break;

} else {

front = back;

back = front.next;

}

}

if (adjacent(j, back)) {

j = merge(j, back);

} else {

j.next = back;

}

if (adjacent(front, j)) {

front = merge(front, j);

} else {

front.next = j;

}

head.freeSize += job.getNc();

}

private boolean adjacent(Node front, Node back) {

if (back == null || front == head) return false;

return (front.initialAddress + front.freeSize == back.initialAddress);

}

/**

* 合并两个相邻的空闲区

* @return 合并后的空闲区节点

*/

private Node merge(Node front, Node back) {

front.freeSize += back.freeSize;

front.next = back.next;

return front;

}

private String[] getOutputInfo(Queue orderQ){

Iterator iterator = orderQ.iterator();

StringBuffer orderBuffer = new StringBuffer(20);

StringBuffer timeBuffer = new StringBuffer(200);

Job job;

while (iterator.hasNext()) {

job = iterator.next();

orderBuffer.append(job.getName() + " ");

timeBuffer.append("Job " + job.getName() + " : Starting Time: " + job.getSt() + " Finished Time: " + job.getFt() + '\n');

}

String[] ans = {orderBuffer.toString(), timeBuffer.toString()};

return ans;

}

private void executeCurrentJob() {

systemTime.increaseByMinute();

/*让当前正在执行的作业执行一分钟*/

currentExecutingJob.executeByMinite();

/*如果执行完毕*/

if (currentExecutingJob.finished()) {

currentExecutingJob.setFt(new Time(systemTime.getHour(), systemTime.getMinute()));

currentExecutingJob.calculateTurnover();

reclaimMemory(currentExecutingJob);//回收执行完毕的作业的空间

currentExecutingJob = pickJobFromMemory();

loadFromWaitingQueue();

}

}

public void printScheduleInfo() {

/*输出这批作业的调度信息*/

String[] info = getOutputInfo(scheduleOrderQueue);

System.out.println("Schedule Order: " + info[0]);

System.out.println("Schedule of Each Job:\n" + info[1]);

double mtt = 0, mwt = 0;//平均周转时间和平均带权周转时间

for (Job job : scheduleOrderQueue) {

mtt += job.getTt();

mwt += job.getWt();

}

mtt /= newestJobIndex;

mwt /= newestJobIndex;

System.out.println(SEPERATOR + "\nMean Turnover Time: " + mtt + " minutes.");

System.out.println(SEPERATOR + "\nMean Weighted Turnover Time: " + mwt + " minutes.");

}

}

schedule java_Schedule.java相关推荐

  1. java关于Timer schedule执行定时任务 1、在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等...

    1.在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等.对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类. private java.util.Time ...

  2. mybatis-错误记录java.lang.ExceptionInInitializerError

    今天刚学习mybatis,遇到了一个错误,纠结了半天的时间,所以将发现的问题和解决得方法写一下. 错误信息如下: java.lang.ExceptionInInitializerErrorat com ...

  3. java wait定时_java定时器的使用(Timer)

    java定时器的使用(Timer) 1.在应用开发中,常常须要一些周期性的操作,比方每5分钟运行某一操作等. 对于这种操作最方便.高效的实现方式就是使用java.util.Timer工具类. priv ...

  4. java 如何解密_java加密与解密

    1.下载:UnlimitedJCEPolicy 主要:获取权限文件 2.把解压后的 local_policy.jar US_export_policy.jar 复制到 这个目录中: C:\Progra ...

  5. edge浏览器 开启java,启动Edge浏览器,然后等待其关闭[重复]

    小编典典 这是一个示例程序,可以通过某种方式设法证明硒库满足您所需的功能.您需要先下载硒库并将其设置为IDE,然后才能运行此程序. 该程序允许您单击一个按钮.然后,Firefox浏览器会自动打开并在几 ...

  6. Java中的Timer和Timer Task详解

    Java Timer&TimerTask原理分析 如果你使用Java语言进行开发,对于定时执行任务这样的需求,自然而然会想到使用Timer和TimerTask完成任务,我最近就使用 Timer ...

  7. maven项目编译漏掉src/main/java下的xml配置文件

    在整合Spring + Mybatis框架的时候,自动扫描配置都已经配置好了. 配置如下: <?xml version="1.0" encoding="UTF-8& ...

  8. java.lang.IllegalAccessError: org.apache.commons.dbcp.DelegatingPreparedStatement.isClosed()Z

    做spring和mybaits整合时出现的错误,让这个问题困扰了一早上,通过查资料终于把这个问题解决了 具体问题描述: 1 java.lang.IllegalAccessError: org.apac ...

  9. MyBatis3: There is no getter for property named 'code' in 'class java.lang.String'

    mybatis3  : mysql文如下,传入参数为string类型时'preCode',运行报错为:There is no getter for property named 'preCode' i ...

  10. controller requestparam不传参数空指针异常_看完这篇文章,让你轻松学会Java异常处理...

    一.背景 最近专门负责团队的项目质量.我在治理异常日志过程中,总结了一下Java的异常处理.上面是我整理的最近自己比较常见的异常知识地图. 二.异常知识地图概述 从异常知识地图最左边的根开始看,地图从 ...

最新文章

  1. Mapped Statements collection does not contain value for TaskMapper.selectByPrimaryKey
  2. linux环境变量配置的方法,Linux环境变量配置方法
  3. MVC项目开发中那些用到的知识点(Asp.Net Mvc3.0 Areas)
  4. 微塔式服务器esxi虚拟机黑群晖,ESXi6主机上安装部署黑群晖虚拟机
  5. python判断网页密码加密方式_Python模拟网页中javascript加密与验证的相关处理
  6. c语言控制led以1s速度,C语言使用定时器的方法控制LED灯以1S的速度闪亮
  7. java 数据校验框架_自己写的基于java Annotation(注解)的数据校验框架
  8. DataTable操作(建表,建行,建列,添加数据)
  9. Unity Invoke 函数调用
  10. 利用Struts拦截器完成文件上传功能
  11. 2004级C++试题及答案
  12. stm8s103k3 周期 捕获_STM8S 输入捕获学习
  13. 电脑PC微信头像和图片不能显示出来?
  14. 《上海市居住证》签注和积分确认流程指南
  15. vue自动计算日期天数
  16. C语言丨getch(),getche()和getchar()的区别
  17. PDF文档签名证书帮助您签署可信的电子合同
  18. 下载open jdk 和阿里Alibaba Dragonwell (开源open JDK)
  19. 组的迷惑行为之 Linux用户的初始用户组(主组,基本组)与有效用户组(附加组)
  20. suse种运行wkhtmltopdf

热门文章

  1. 循环队列 代码实现(FIFO)
  2. 分布式存储系统学习笔记(一)—什么是分布式系统(4)—容错机制
  3. LIO-SAM探秘第三章之代码解析(四) --- mapOptmization.cpp (2)
  4. 区块链中心化业务必须基于中心化平台吗?
  5. DataFactory插入MySQL中文乱码问题
  6. 多线程访问数据库ADO
  7. 搜索引擎蜘蛛及网站robots.txt文件详解[转载]
  8. SAM4E单片机之旅——22、GMAC和PHY的介绍与初始化
  9. 使用wordpress的心得
  10. 【版本控制】如何从github 上删除项目