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

📄 bank.java

📁 操作系统银行家算法
💻 JAVA
字号:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class bank extends JFrame 
{

JLabel labelInfo=new JLabel("请先初始化available和max"); 

JTextField[] textAvailable=new JTextField[r_num];
JTextField[][] textAllocation=new JTextField[p_num][r_num];
JTextField[][] textCheckAllocation=new JTextField[p_num][r_num];
//JTextField[][] textNeed=new JTextField[p_num][r_num];
JTextField textProcessName=new JTextField("p");
JTextField[] textRequest=new JTextField[r_num];
JTextArea print_out=new JTextArea();
JButton buttonRequest=new JButton("Request");
JButton buttonSetInit=new JButton("SetInit");
JButton buttonSafe=new JButton("Safe?");
JButton buttonEsc=new JButton("Redo");
JScrollPane sp;

//内部矩阵
public static int p_num=bank_win.num1;
public static int r_num=bank_win.num2;
int available[]=new int[r_num];
int need[][]=new int[p_num][r_num],allocation[][]=new int[p_num][r_num];
int max[][]=new int[p_num][r_num];
int finished[]={0,0,0,0,0};
Worknode stack[]=new Worknode[p_num];   
Worknode current=new Worknode();
int top=-1;
public class Worknode extends Object
{
 protected int ip;
 protected int able[]=new int[p_num];
 protected int visited[]=new int[p_num];
 protected int remain[]=new int[r_num];

 public Worknode()
 {
 	for(int i=0;i<p_num;i++)
 	{
 		visited[i]=0;
 		able[i]=0;
 	}
 	
 	for(int i=0;i<r_num;i++)
 	{
 		remain[i]=0;
 	}
 	
 }
 
}

 


public bank(int num1,int num2)
{
   showface();

}

/*public bank()
{
   showface();
   for(int i=0;i<p_num;i++)
   {
   	   stack[i]=new WorkNode();
   }
}*/

public boolean small(int x[],int y[])
{
 int i;
 for(i=0;i<r_num;i++)
 {
  if(x[i]>y[i])break;
 }
 if(i==r_num)return true;
 return false;
}

public void add(int x[],int y[])
{
 int i;
 for(i=0;i<r_num;i++)
  x[i]+=y[i];
}

public void output()
{
 int i;
 String str=" ";
 for(i=0;i<=top;i++)
 {
 	str=str+"p"+(stack[i].able[stack[i].ip]+1)+" ";
 	//print_out.setText("begin");
 }
  print_out.setText(print_out.getText()+"\n"+str);
  
  for(i=0;i<=top;i++)
		{
			System.out.print("p"+stack[i].able[stack[i].ip]);
			if(i!=top)
				System.out.print("->");
		}
		System.out.println();
			
}

public void copy(Worknode s,Worknode c)
	{
		int i;
		s.ip=c.ip;
		for(i=0;i<p_num;i++)
		{
			s.able[i]=c.able[i];
			s.visited[i]=c.visited[i];
		}
		for(i=0;i<r_num;i++)
			s.remain[i]=c.remain[i];
	}

public void showface()
{
        for(int i=0;i<p_num;i++)
   {
   	   stack[i]=new Worknode();
   }
 
        JPanel contentPane;
        contentPane = (JPanel) this.getContentPane();
        contentPane.setLayout(null);
        
        labelInfo.setBounds(20,10,530,30);
        labelInfo.setOpaque(true);
        labelInfo.setBackground(Color.white); 
        labelInfo.setForeground(Color.red);
        contentPane.add(labelInfo,null);
        
        JLabel labelAvailableLabel=new JLabel("available");
        JLabel labelMaxLabel=new JLabel("max");
        JLabel labelAllocationLabel=new JLabel("allocation");
        JLabel outLabel=new JLabel("result");
        JLabel labelRequestLabel=new JLabel("request");
        JLabel labelProcessNameLabel=new JLabel("process");
        labelMaxLabel.setBounds(20, 50, 100, 20);//x,y,width,height
        contentPane.add(labelMaxLabel,null);
        
        labelAvailableLabel.setBounds(370,40,100,20);
        contentPane.add(labelAvailableLabel,null);
        
        labelAllocationLabel.setBounds(20,200,100,20);
        contentPane.add(labelAllocationLabel,null);
        
        outLabel.setBounds(390,185,100,20);
        contentPane.add(outLabel,null);
                
       
        print_out.setEditable(true);
        //print_out.setLineWrap(true);
        sp=new JScrollPane(print_out);
         sp.setBounds(390,220,200,120);
        //contentPane.add(print_out);
        contentPane.add(sp);

        labelRequestLabel.setBounds(20,320,100,20);
        contentPane.add(labelRequestLabel,null);
        
        labelProcessNameLabel.setBounds(80,320,50,20);
        contentPane.add(labelProcessNameLabel,null);
        
        buttonSetInit.setBounds(410,140,90,20);
        contentPane.add(buttonSetInit,null);
        
        buttonEsc.setBounds(510,140,90,20);
        contentPane.add(buttonEsc,null);
        
        textProcessName.setBounds(80,350,50,20);
        contentPane.add(textProcessName,null);
        
        buttonRequest.setBounds(410,350,90,20);
        contentPane.add(buttonRequest,null);
        
        buttonSafe.setBounds(510,350,90,20);
        contentPane.add(buttonSafe,null);

        //添加进程名标签
        JLabel[] labelProcessLabel1={new JLabel("p1"),new JLabel("p2"),new JLabel("p3"),new JLabel("p4"),new JLabel("p5")};
        JLabel[] labelProcessLabel2={new JLabel("p1"),new JLabel("p2"),new JLabel("p3"),new JLabel("p4"),new JLabel("p5")};
        //JLabel[] labelProcessLabel3={new JLabel("p1"),new JLabel("p2"),new JLabel("p3"),new JLabel("p4"),new JLabel("p5")};
        
        JPanel pPanel1=new JPanel(),pPanel2=new JPanel(),pPanel3=new JPanel();
        pPanel1.setLayout(null);
        pPanel2.setLayout(null);
        //pPanel3.setLayout(null);
        
        for(int pi=0;pi<p_num;pi++)
        {
        labelProcessLabel1[pi].setBounds(0,0+pi*20,25,25);
        labelProcessLabel2[pi].setBounds(0,0+pi*20,25,25);
        //labelProcessLabel3[pi].setBounds(0,0+pi*20,25,25);
        }
        
        pPanel1.setBounds(80,80,60,100);
        pPanel2.setBounds(80,220,60,100);
        //pPanel3.setBounds(360,220,60,100);
        
        //for(int pi=0;pi<p_num;pi++)
       // {
        pPanel1.add(labelProcessLabel1[pi],null);
        pPanel2.add(labelProcessLabel2[pi],null);
        //pPanel3.add(labelProcessLabel3[pi],null);
       // }
        
        contentPane.add(pPanel1);
        contentPane.add(pPanel2);
        //contentPane.add(pPanel3);
        
        //添加资源名标签,用此种方法好
        xZSourceLabel labelSourceLabel[]={ new xZSourceLabel(),new xZSourceLabel(),new xZSourceLabel(),new xZSourceLabel(),new xZSourceLabel()};
        
        labelSourceLabel[0].setBounds(150,50,200,20);
        labelSourceLabel[1].setBounds(400,50,200,20);
        labelSourceLabel[2].setBounds(150,200,200,20);
        labelSourceLabel[3].setBounds(150,320,200,20);
        //labelSourceLabel[r_num].setBounds(400,200,200,20);
        
        contentPane.add(labelSourceLabel[0]);
        contentPane.add(labelSourceLabel[1]);
        contentPane.add(labelSourceLabel[2]);
        contentPane.add(labelSourceLabel[3]);
        //contentPane.add(labelSourceLabel[r_num]);
        
        for(int si=0;si<r_num;si++)
       // for(int pi=0;pi<p_num;pi++)
        {
           textNeed[pi][si]=new JTextField("0");
           textNeed[pi][si].setBounds(150+si*50,80+pi*20,50,20);
           textAllocation[pi][si]=new JTextField("0");           //无字标签看不见
           textAllocation[pi][si].setBounds(150+si*50,220+pi*20,50,20);
           //textCheckAllocation[pi][si]=new JTextField("");
           //textCheckAllocation[pi][si].setEditable(false);
           //textCheckAllocation[pi][si].setBounds(400+si*50,220+pi*20,50,20);
        }
        
        //for(int si=0;si<r_num;si++)
        //{
        textAvailable[si]=new JTextField("0");     //需初始化
        textAvailable[si].setBounds(400+si*50,80,50,20);
        textRequest[si]=new JTextField();//
        textRequest[si].setBounds(150+si*50,350,50,20);
        contentPane.add(textAvailable[si],null);
        contentPane.add(textRequest[si],null);
        //}
        
       // for(int pi=0;pi<p_num;pi++)
       // for(int si=0;si<r_num;si++)
       // {
           contentPane.add(textNeed[pi][si],null);
           contentPane.add(textAllocation[pi][si],null);
           //contentPane.add(textCheckAllocation[pi][si],null);
        //}
        
        //添加监听器
           buttonSetInit.addActionListener(new ActionListener()
        {
           public void actionPerformed(ActionEvent e)
        {
           setInit();
           labelInfo.setText("已经初始化系统状态,可以申请资源");
           buttonSetInit.setEnabled(false);
           buttonRequest.setEnabled(true);
           buttonSafe.setEnabled(true);
           buttonEsc.setEnabled(true);
           
        }
        });
        
        buttonEsc.addActionListener(new ActionListener()
        {
           public void actionPerformed(ActionEvent e)
        {
           new bank_win();
        }
        });
        
        buttonRequest.setEnabled(false);
        buttonSafe.setEnabled(false);
        buttonEsc.setEnabled(false);
        
        buttonRequest.addActionListener(new ActionListener()
        {
        public void actionPerformed(ActionEvent e)
        {
           request();
        }
        });
        
        buttonSafe.addActionListener(new ActionListener()
        {
         public void actionPerformed(ActionEvent e)
        {
           int ct;
           for(int i=0;i<p_num;i++)
           if(small(need[i],current.remain) )
           current.able[++current.ip]=i;
           if(current.ip==-1)
        {
           print_out.setText("现状态不安全\n");
        }
           else
           {
               ct=bankalgo();
               print_out.setText(print_out.getText()+"\n现状态安全,有"+ct+"个安全序列\n");
           }
           //else 
           //out.setText("\nit is unsafe\n");
        }
        });
        
        this.setSize(650, 450);
        this.setLocation(100,100);
        this.setResizable(false);
        this.setTitle("银行家算法演示");
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}//end showface


//设置系统初始状态
public void setInit()
{
   for(int si=0;si<r_num;si++)
   {
    available[si]=Integer.parseInt(textAvailable[si].getText());
    current.remain[si]=available[si];
    current.ip=-1;
    textAvailable[si].setEditable(false);
   }
    for(int si=0;si<r_num;si++)
    for(int pi=0;pi<p_num;pi++)
    {
     max[pi][si]=Integer.parseInt(textNeed[pi][si].getText());
     textNeed[pi][si].setEditable(false);
     allocation[pi][si]=Integer.parseInt(textAllocation[pi][si].getText());
     need[pi][si]=max[pi][si]-allocation[pi][si];
     textAllocation[pi][si].setEditable(false);
    }
}

//申请资源
public void request()
{
   int pi;
  
    for(pi=0;pi<r_num;pi++)
    if(finished[pi]==1) finished[pi]=0;
   
   if(textProcessName.getText().equals("p1")) pi=0;
   else if(textProcessName.getText().equals("p2")) pi=1;
   else if(textProcessName.getText().equals("p3")) pi=2;
   else if(textProcessName.getText().equals("p4")) pi=3;
   else { 
    labelInfo.setText("错误,无此进程");
    return;
   }
    
   int request[]=new int[r_num];
   for(int si=0;si<r_num;si++)
    request[si]=Integer.parseInt(textRequest[si].getText());
   
   if(request[0]<=need[pi][0] && request[1]<=need[pi][1]
    && request[2]<=need[pi][2]&& request[3]<=need[pi][3] )
    if(request[0]<=available[0] && request[1]<=available[1]
     && request[2]<=available[2]&& request[3]<=available[3] )
     {
      for(int si=0;si<r_num;si++){
       available[si]=available[si]-request[si];
       allocation[pi][si]=allocation[pi][si]+request[si];
       need[pi][si]=need[pi][si]-request[si];
      }
    
      if(isSafe())
      {
       labelInfo.setText("申请成功");
       for(int si=0;si<r_num;si++)
       {
        textAvailable[si].setText(String.valueOf(available[si]));
        textAllocation[pi][si].setText(String.valueOf(allocation[pi][si]));
        textNeed[pi][si].setText(String.valueOf(need[pi][si]));
       }
       //进程完成要返还资源
       if(need[pi][0]==0 && need[pi][1]==0 && need[pi][2]==0)
       	{
        finished[pi]=1;
        labelInfo.setText("申请成功,进程"+(pi+1)+"已经完成");
        
        for(int si=0;si<r_num;si++)
        {
         available[si]=available[si]+allocation[pi][si];
         textAvailable[si].setText(String.valueOf(available[si]));
         textAllocation[pi][si].setText("OK");
        }
       }
      }
      
      else{
       labelInfo.setText("申请失败,因为它将导致系统进入不安全状态");
       for(int si=0;si<r_num;si++)
       {
        available[si]=available[si]+request[si];
        allocation[pi][si]=allocation[pi][si]-request[si];
        need[pi][si]=need[pi][si]+request[si];
       }
      }
    }
    else labelInfo.setText("资源不足,申请不成功");
    else labelInfo.setText("错误,该进程不需要那么多的资源");
   //end if 
}//end request

//安全检查
public boolean isSafe()
{
   int work[]={available[0],available[1],available[2],available[3]};  
   	
   	
   for(int pi=0;pi<r_num; pi++)
   	{
    if(finished[pi]==0 && need[pi][0]<=work[0]
     && need[pi][1]<=work[1] && need[pi][2]<=work[2] && need[pi][3]<=work[3])
     {
      work[0]=work[0]+allocation[pi][0];
      work[1]=work[1]+allocation[pi][1];
      work[2]=work[2]+allocation[pi][2];
      work[3]=work[3]+allocation[pi][3];
      finished[pi]=1;
      pi=0;
     }//end if
   }//end for
  
    for(int pi=0;pi<r_num;pi++)
    if(finished[pi]==0) 
    	return false;
  
   return true;
}//end isSafe

public int bankalgo()
{
 int i,ct=0,k=0;
 String str="";
 while(true){
  copy(stack[++top],current);
	if(current.ip==-1)
	break;
  current.visited[current.able[current.ip]]=1;
  add(current.remain,allocation[current.able[current.ip]]);
  current.ip=-1;
  for(i=0;i<p_num;i++)
   if(current.visited[i]==0 && small(need[i],current.remain) )
    current.able[++current.ip]=i;
  if(current.ip==-1)
  {
   if(top==p_num-1)
   {
    output();
    //print_out.setText(str);
    ct++;
   }
   ///else if(top<0)break;
   copy(current,stack[top--]);
   while(current.ip==0)
   {if(k==p_num-1)
   	break;
   	copy(current,stack[top--]);
    k++;
   }
   k=0;
   current.ip--;

  }

 }

 return ct;

}


public static void main(String arg[])
{
   new bank();
}
}


class xZSourceLabel extends JPanel
{
public xZSourceLabel()
{
    JLabel[] labelSourceLabel={new JLabel("s1"),new JLabel("s2"),
    new JLabel("s3"),new JLabel("s4")
   };
   //JPanel contentPane = this;
        this.setLayout(null);
   for(int si=0;si<4;si++)
   	{
        labelSourceLabel[si].setBounds(0+si*50,0,50,20);
        this.add(labelSourceLabel[si]);
    }
}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -