第一步—创建netbean模拟进程调度面板
(想直接看调度算法的直接跳过第一步。进程撤销未实现)
-----------------除了进程撤销面板上的功能都能实现
从上➡左➡右的文本区域分别为JTextArea1,JTextArea2,JTextArea3
//创建进程按钮绑定事件
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
P_Listadd.add_process(jTextField5.getText(), Float.parseFloat(jTextField6.getText()), Float.parseFloat(jTextField7.getText()));
jTextArea1.append("添加成功,进程名为" + jTextField5.getText() + "进入时间" + jTextField6.getText() + "处理需要时间" + jTextField7.getText() + "\n"); // TODO add your handling code here:
}
//查看已有进程按钮绑定事件
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
int i = P_Listadd.P_arrtList.size();
int j = 0;
//将存在进程便利输出
for (; j <= i; j++) {
jTextArea2.append("进程名字为" + P_Listadd.P_nameList.get(j) + "\n");
jTextArea2.append("进程进入时间" + P_Listadd.P_arrtList.get(j) + "\n");
jTextArea2.append("进程需要处理时间" + P_Listadd.P_dealtiList.get(j) + "\n");
jTextArea2.append("------------------------------------------------" + "\n");
if (j == i - 1) {
break;
}
} // TODO add your handling code here:
}
//按钮MFQ算法调度绑定事件
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
//运行MFQ调度算法
MFQ_start.start(P_Listadd.P_nameList, P_Listadd.P_arrtList, P_Listadd.P_dealtiList, jTextArea3); // TODO add your handling code here:
}
第二步—创建存储进程的队列
P_Listadd.java
import java.util.ArrayList;
class P_Listadd {
//进程名字
static ArrayList<String> P_nameList = new ArrayList<>();
//进程进入时间
static ArrayList<Float> P_arrtList = new ArrayList<>();
//进程需要运行时间
static ArrayList<Float> P_dealtiList = new ArrayList<>();
//添加进程
static void add_process(String name, float arrive, float dealtime){
P_nameList.add(name);
P_arrtList.add(arrive);
P_dealtiList.add(dealtime);
}
}
第三步—把创建后所有进程根据进入就绪时间排序
创建排序算法Listmainindex.java
public class Listmainindex{
//寻找进入时间最早的
int searchmin(ArrayList<Float> arrayList){
//记录长度
int i = arrayList.size();
//循环找到第一个最小值的索引
float j = arrayList.get(0);
int index = 0;
for(int q = 0;q <= i;q++){
if(arrayList.get(q)<j){
j = arrayList.get(q);
index = q;
}
if(q == i-1){
if(arrayList.get(q)<j){
j = arrayList.get(q);
index = q;
}
break;
}
}
return index;
}
}
最后一步—核心算法-多级反馈队列调度算法(非抢占)
MFQ_start.java
import java.util.ArrayList;
import javax.swing.JTextArea;
class MFQ_start {
/*先将进根据就绪时间程排序,
然后根据时间加入队列,
每次加入一个队列就把信息移动到队列中并且移除原来的信息,
当进程结束 移除此进程所有信息*/
static void start(ArrayList<String> name, ArrayList<Float> artime, ArrayList<Float> detime, JTextArea a) {
Listmainindex min = new Listmainindex();
a.append("开始运行" + "\n" + "------------------------------------------------------------" + "\n");
//创建运行4级队列
ArrayList<String> FirstList = new ArrayList<>();
ArrayList<String> SecondList = new ArrayList<>();
ArrayList<String> ThirdList = new ArrayList<>();
ArrayList<String> FourthList = new ArrayList<>();
//创建4级队列分别时间片
float FL = 1;
float SL = 2;
float TL = 4;
float FOL = 8;
//取i为进程个数
int i = name.size();
//存储排序过后的list
ArrayList<String> newnameList = new ArrayList<>();
ArrayList<Float> newartimeList = new ArrayList