📄 cpusheduling.java
字号:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
class ConfirmDialog extends Dialog implements ActionListener //出现异常处理弹出对话框
{ private Button okay = new Button("确定");
private Button cancel = new Button("取消");
private Label label = new Label("Are you sure?",Label.CENTER);
public boolean isOkay = false;
private class WindowCloser extends WindowAdapter
{ public void windowClosing(WindowEvent we)
{ ConfirmDialog.this.isOkay = false;
ConfirmDialog.this.setVisible(true);
setVisible(true);
}
}
public ConfirmDialog(Frame parent)
{ this(parent,"Please confirm","Are you sure?"); }
public ConfirmDialog(Frame parent,String title,String question)
{ super(parent,title,true);
label.setText(question);
setup();
okay.addActionListener(this);
cancel.addActionListener(this);
addWindowListener(new WindowCloser());
setResizable(false);
setSize(250,150);
setVisible(true);
}
private void setup()
{ Panel buttons = new Panel();
buttons.setLayout(new FlowLayout());
buttons.add(okay); buttons.add(cancel);
setLayout(new BorderLayout());
add("Center",label); add("South",buttons);
}
public void actionPerformed(ActionEvent ae)
{ isOkay = (ae.getSource() == okay);
setVisible(false);
}
}
class PCB//进程的数据结构
{
String name; //进程名
int need_time;// 进程需要运行时间
int runed_time;//进程已经运行的时间
char state; // 进程的状态:A为就绪状态,E为结束状态,R为运行状态
PCB next;//指出下个一进程PCB的地址的指针
PCB(String _name,int _time)
{name=_name;
need_time=_time;
runed_time=0;
state='A';
next=null;
}
public String getName() // 得到进程名
{return name;}
public int getNeed_time() // 得到需要运行时间
{return need_time;}
public int getRuned_time() //得到已经运行时间
{return runed_time;}
public char getState() //得到进程运行状态
{return state;}
public PCB getNext() //得到下一个PCB的地址
{return next;}
public void setNext(PCB _next) //设置下一个PCB地址
{next=_next;}
public void setState(char _state) //设置进程状态
{state=_state;}
public void setRuned_time (int _runed_time)//设置进程的已运行时间
{runed_time=_runed_time;}
}
public class cpusheduling extends Frame implements ActionListener
{
private Label title_label1=new Label("单处理器环境下的处理器调度模拟");//标题
private Label title_label2=new Label("实现算法:时间片轮转法");
private Label title_label3=new Label("设计者:计算机学院 陈华");
private Label input_label1=new Label("输入区"); //输入区
private Label input_label2=new Label("进程名");
private Label input_label3=new Label("要求运行时间");
private TextField input_name=new TextField(6); //输入进程名
private TextField input_time=new TextField(6); //输入时间
private Button input_button=new Button("输入"); //输入按键
private Label output_label1=new Label("输出区"); //输出区
private Label output_label2=new Label("正在运行的进程");
private Label output_label3=new Label("就绪的进程");
public TextField output_run=new TextField(20); //输出正在运行的进程
public TextField output_ready=new TextField(20); //输出就绪的进程
private Button begin_button=new Button("开始进行CPU调度"); //控制按键
private Button exit_button=new Button("退出");
final int time0=1;//时间片
public int p_num=0;//指示目前的进程数
public PCB r;// 指示正在运行的进程
public PCB head=null; //头指针
public PCB tail=null; //尾部指针
public PCB q; //用来输出就绪队列中的信息
public String Readyline=" "; //保存就绪队列中的进程名
public String in_name; //输入的进程名
public int in_time; //输入的时间
public int in_name_length ;//输入的进程名的长度
private class WindowCloser extends WindowAdapter
{public void windowClosing(WindowEvent we)
{System.exit(0);}
}
private void setup() //用户界面设置
{
Panel title=new Panel(); //标题面板设置
title.setLayout(new BorderLayout());
title.add("North",title_label1);
title.add("Center",title_label2);
title.add("South",title_label3);
Panel input=new Panel(); //输入区面板设置
input.setLayout(new FlowLayout());
input.add(input_label1);
input.add(input_label2);
input.add(input_name);
input.add(input_label3);
input.add(input_time);
input.add(input_button);
Panel output=new Panel(); //输出区面板设置
output.setLayout(new FlowLayout());
output.add(output_label1);
output.add(output_label2);
output.add(output_run);
output.add(output_label3);
output.add(output_ready);
Panel control=new Panel(); //开始和暂停键面板设置
control.setLayout(new FlowLayout());
control.add(begin_button);
control.add(exit_button);
Panel put=new Panel();
put.setLayout(new BorderLayout());
put.add ("South",output);
put.add ("North",input );
setLayout(new BorderLayout()); //整体面板设置
add("North",title);
add("Center",put);
add("South",control);
}
public cpusheduling() // cpusheduling的构造方法
{
super("cpu_sheduling");
setup(); //面板设置
input_button.addActionListener(this); //添加监听器
begin_button.addActionListener(this);
exit_button.addActionListener(this);
addWindowListener(new WindowCloser());
output_run.setEditable(false);
output_ready.setEditable(false);
setSize(700,350); //设置面板大小
setVisible(true);
}
public void actionPerformed(ActionEvent ae)
{
if((ae.getSource()==input_button)&&(!input_name.getText().equals(""))&&
(!input_time.getText().equals("")))//输入区监听事件
{ in_name=input_name.getText();
in_time=Integer.parseInt(input_time.getText());
in_name_length= in_name.length();
if(in_name_length>=6) //进程名太长提示
{ ConfirmDialog warn0=new ConfirmDialog(this,"警告",
"你输入的进程名字符太长,请重新输入");
if (warn0.isOkay)
setVisible(true);
}
if(in_time>=20) //输入进程的运行时间过长提示
{ConfirmDialog warn1=new ConfirmDialog(this,"警告",
"你输入的运行时间太长,请重新输入");
if (warn1.isOkay) setVisible(true);
}
PCB newprocess=new PCB(in_name,in_time);
process_add(newprocess);
if(p_num>=8) //如果进程大于8个,出现警告
{ConfirmDialog warn2=new ConfirmDialog(this,"警告",
"进程数已多于8个,不能再输入");
if (warn2.isOkay) setVisible(true);
}
}
else if(ae.getSource()==begin_button)
{
if(p_num==0)
{ ConfirmDialog warn4=new ConfirmDialog(this,"警告",
"没有可以调度的进程了,请输入新进程");
if (warn4.isOkay) setVisible(true);
}
else
sheduling();
process_print();
}
else if (ae.getSource()== exit_button)
System.exit(0);
}
void process_add(PCB p)// 添加进程
{
if (head==null&&tail==null) //加入队列前就绪队列中没有进程
{
head=p;
head.setNext(null);
p_num=p_num+1;
}
else if (head.getNext()==null&&tail==null)//只有一个进程
{tail=p;
head.setNext(tail);
tail.setNext(head);
p_num=p_num+1;
}
else //多于一个进程则加入到队尾
{
tail.setNext(p);
tail=p;
tail.setNext(head);
p_num=p_num+1;
}
}
void sheduling() //cpu进程调度
{ if(head.getState()=='E')
{head=null;
tail=null;
output_run.setText("没有可运行进程");
output_ready.setText("没有就绪进程");
ConfirmDialog warn=new ConfirmDialog(this,"警告",
"目前在已没有进程,请重新输入或者是退出");
if (warn.isOkay) setVisible(true);
}
if(head.getNext()==null)
{output_ready.setText("没有就绪进程");}
else{
r=head;
head=head.getNext();//head指针后移
r.setNext(null);
r.setState('R');
r.setRuned_time(r.getRuned_time()+time0);//进程已运行时间加1
if(r.getNeed_time()==r.getRuned_time())//一个进程已经运行完
{r.setState('E');
p_num=p_num-1;
}
process_add(r);//进程没有运行完,则加到就绪队列的对尾
}
}
void process_print() //输出进程的相关信息
{
output_run.setText(r.getName());
q=head;
while(q.getNext()!=head&&q.getState()!='E')
{ Readyline=Readyline+q.getName()+" ";
q=q.getNext();
}
output_ready.setText(Readyline+"进程在就绪");
Readyline=" ";
}
public static void main(String[] args) {
cpusheduling cpu_sheduling = new cpusheduling();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -