⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spf.java

📁 操作系统-短进程优先调度算
💻 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 + -