📄 spf.java
字号:
/*
*作者:陈伟淳
*联系方式:beijihu3@163.com
*说明:操作系统-短进程优先调度算法(SPF)
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SPF extends JFrame implements ActionListener,Runnable{
Thread myThread;
JPanel p1=new JPanel();
JPanel p2=new JPanel();
JButton []b=new JButton[10]; /*就绪队列*/
JButton jbBegin,jbAdd,jbSuspend;
public int [][]pcb=new int [10][3]; /*最多10个进程。存放进程信息:第一列表示所需时间片,第二列表示已执行与否,第三列表示执行进度*/
public int pcbCount=5; /*进程数量,最多10个进程*/
boolean Continue=false; /*开始执行标志*/
boolean Susp=false; /*增加进程标志*/
public SPF(){
/*线程*/
myThread=new Thread(this);
myThread.start();
/*程序窗口初始化*/
JFrame f=new JFrame();
f.setTitle("短进程优先调度算法(SPF)");
f.setSize(650,450);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
f.setLayout(new GridLayout(1,2));
/*进程信息初始化*/
for(int i=0;i<10;i++){
if(i<5){
int tNeed=(int)(Math.random()*388);
pcb[i][0]=tNeed;
pcb[i][1]=1; /*未执行,显示*/
pcb[i][2]=0;
b[i]=new JButton(" 进程"+(i+1)+" 作业数"+tNeed+" ");
}
else{
pcb[i][1]=0; /*无进程,不显示*/
b[i]=new JButton();
}
}
p1.setVisible(true);
p1.setLayout(new GridLayout(10,1));
for(int i=0;i<10;i++)
p1.add(b[i]);
/*初始化“添加进程”和“开始”按钮*/
jbBegin=new JButton(" 开始 ");
jbAdd=new JButton(" 添加进程 ");
jbSuspend=new JButton(" 阻塞 ");
p2.setVisible(true);
p2.setLayout(new GridLayout(3,1));
p2.add(jbBegin);
p2.add(jbAdd);
p2.add(jbSuspend);
f.add(p1);
f.add(p2);
/*添加事件监听*/
jbBegin.addActionListener(this);
jbAdd.addActionListener(this);
jbSuspend.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
if (e.getSource() == jbBegin){
if(Continue==false)
Continue=true;
}
if (e.getSource() == jbAdd){
if(pcbCount<10){
int tNeed=(int)(Math.random()*388);
pcb[pcbCount][0]=tNeed;
pcb[pcbCount][1]=1;
pcb[pcbCount][2]=0;
b[pcbCount].setText(" 进程"+(pcbCount+1)+" 作业数"+tNeed+" ");
pcbCount++;
}
}
if (e.getSource() == jbSuspend){
Susp=true;
}
}
public void run(){
while(true){
if(Continue==true){
int cpu[]=new int[]{1000,-1,0};
int select=0;
//选出工作数最短的进程
for(int i=0;i<pcbCount;i++){
//剩余的工作数,即还未执行的工作数最少的被选中
if((pcb[i][0]-pcb[i][2])<cpu[0] && pcb[i][1]==1){
select=i;
cpu=pcb[i];
}
}
/*已执行的进程不能再执行*/
if(pcb[select][1]==2)
select=-1;
//如果被选中开始执行的进程,则不再在队列中显示,把显示标记置2
else
pcb[select][1]=1;
//放到开始按钮(CPU)上显示
if(select!=-1){
for(int j=0;j<=cpu[0];j++){
if(Susp==true){
jbBegin.setText("处理I/O请求,"+"进程"+(select+1)+" 阻塞");
try{
Thread.sleep(3888);
}catch(InterruptedException e){};
Susp=false;
break;
}
else{
if(cpu[2]==cpu[0])
break;
jbBegin.setText("进程"+(select+1)+" 作业数"+cpu[0]+"正在执行: "+(++cpu[2]));
try{
Thread.sleep(30);
}catch(InterruptedException e){};
}
}
pcb[select]=cpu;
}
try{
Thread.sleep(300);
}catch(InterruptedException e){};
/*已执行完的进程将标志位置2*/
if(select!=-1){
if(pcb[select][2]>=pcb[select][0])
pcb[select][1]=2;
}
//重新显示就绪队列
for(int j=0;j<10;j++){
if(pcb[j][1]==1)
b[j].setText(" 进程"+(j+1)+" 作业数"+pcb[j][0]+" "+" 已执行:"+pcb[j][2]);
if(pcb[j][1]==2)
b[j].setText(" 进程"+(j+1)+" 执行完毕");
}
}
}
}
public static void main(String []args){
new SPF();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -