schedule java_Schedule.java
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相关推荐
- java关于Timer schedule执行定时任务 1、在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等...
1.在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等.对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类. private java.util.Time ...
- mybatis-错误记录java.lang.ExceptionInInitializerError
今天刚学习mybatis,遇到了一个错误,纠结了半天的时间,所以将发现的问题和解决得方法写一下. 错误信息如下: java.lang.ExceptionInInitializerErrorat com ...
- java wait定时_java定时器的使用(Timer)
java定时器的使用(Timer) 1.在应用开发中,常常须要一些周期性的操作,比方每5分钟运行某一操作等. 对于这种操作最方便.高效的实现方式就是使用java.util.Timer工具类. priv ...
- java 如何解密_java加密与解密
1.下载:UnlimitedJCEPolicy 主要:获取权限文件 2.把解压后的 local_policy.jar US_export_policy.jar 复制到 这个目录中: C:\Progra ...
- edge浏览器 开启java,启动Edge浏览器,然后等待其关闭[重复]
小编典典 这是一个示例程序,可以通过某种方式设法证明硒库满足您所需的功能.您需要先下载硒库并将其设置为IDE,然后才能运行此程序. 该程序允许您单击一个按钮.然后,Firefox浏览器会自动打开并在几 ...
- Java中的Timer和Timer Task详解
Java Timer&TimerTask原理分析 如果你使用Java语言进行开发,对于定时执行任务这样的需求,自然而然会想到使用Timer和TimerTask完成任务,我最近就使用 Timer ...
- maven项目编译漏掉src/main/java下的xml配置文件
在整合Spring + Mybatis框架的时候,自动扫描配置都已经配置好了. 配置如下: <?xml version="1.0" encoding="UTF-8& ...
- java.lang.IllegalAccessError: org.apache.commons.dbcp.DelegatingPreparedStatement.isClosed()Z
做spring和mybaits整合时出现的错误,让这个问题困扰了一早上,通过查资料终于把这个问题解决了 具体问题描述: 1 java.lang.IllegalAccessError: org.apac ...
- 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 ...
- controller requestparam不传参数空指针异常_看完这篇文章,让你轻松学会Java异常处理...
一.背景 最近专门负责团队的项目质量.我在治理异常日志过程中,总结了一下Java的异常处理.上面是我整理的最近自己比较常见的异常知识地图. 二.异常知识地图概述 从异常知识地图最左边的根开始看,地图从 ...
最新文章
- Mapped Statements collection does not contain value for TaskMapper.selectByPrimaryKey
- linux环境变量配置的方法,Linux环境变量配置方法
- MVC项目开发中那些用到的知识点(Asp.Net Mvc3.0 Areas)
- 微塔式服务器esxi虚拟机黑群晖,ESXi6主机上安装部署黑群晖虚拟机
- python判断网页密码加密方式_Python模拟网页中javascript加密与验证的相关处理
- c语言控制led以1s速度,C语言使用定时器的方法控制LED灯以1S的速度闪亮
- java 数据校验框架_自己写的基于java Annotation(注解)的数据校验框架
- DataTable操作(建表,建行,建列,添加数据)
- Unity Invoke 函数调用
- 利用Struts拦截器完成文件上传功能
- 2004级C++试题及答案
- stm8s103k3 周期 捕获_STM8S 输入捕获学习
- 电脑PC微信头像和图片不能显示出来?
- 《上海市居住证》签注和积分确认流程指南
- vue自动计算日期天数
- C语言丨getch(),getche()和getchar()的区别
- PDF文档签名证书帮助您签署可信的电子合同
- 下载open jdk 和阿里Alibaba Dragonwell (开源open JDK)
- 组的迷惑行为之 Linux用户的初始用户组(主组,基本组)与有效用户组(附加组)
- suse种运行wkhtmltopdf
热门文章
- 循环队列 代码实现(FIFO)
- 分布式存储系统学习笔记(一)—什么是分布式系统(4)—容错机制
- LIO-SAM探秘第三章之代码解析(四) --- mapOptmization.cpp (2)
- 区块链中心化业务必须基于中心化平台吗?
- DataFactory插入MySQL中文乱码问题
- 多线程访问数据库ADO
- 搜索引擎蜘蛛及网站robots.txt文件详解[转载]
- SAM4E单片机之旅——22、GMAC和PHY的介绍与初始化
- 使用wordpress的心得
- 【版本控制】如何从github 上删除项目