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

📄 cpusheduling.java

📁 这是一个JAVA编写的CPU调度程序,但是中间还是存在一些问题!希望大家可以改进!采用的是时间片轮转法!
💻 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 + -