1. 程式人生 > >銀行家演算法的java程式碼實現,Swing寫的介面

銀行家演算法的java程式碼實現,Swing寫的介面

java程式碼實現了銀行家演算法,介面寫的個人認為還是較為細緻的,完整的實現了找安全序列等演算法功能,可作為參考學習銀行家演算法。

直接上程式碼:①介面展示方法:

public void ShowFrame()             
  {
              this.setSize(500, 350);   //大小           
              this.setAlwaysOnTop(true);
              this.setResizable(false);//不可拖動               
              this.setLayout(new BorderLayout());
              this.setTitle("lly_banktest");
             
              jp1=new JPanel();
              String s[]=  {"Allocation","Max","Available","Request"};
              jcb1=new JComboBox(s);
              jp1.add(jcb1);       
              jp1.add(new JLabel("PID:"));
              jtf1=new JTextField(3);
              jp1.add(jtf1);
              jp1.add(new JLabel("A:"));
              jtf2=new JTextField(3);        
              jp1.add(jtf2);
              jp1.add(new JLabel("B:"));
              jtf3=new JTextField(3);        
              jp1.add(jtf3);
              jp1.add(new JLabel("C:"));
              jtf4=new JTextField(3);        
              jp1.add(jtf4);
              jb1=new JButton("確定");
              jp1.add(jb1);
              jb1.addActionListener(this);
              this.add(jp1,"South");                                  
               jta1= new JTextArea();            //顯示檔案本域     
               ShowData();                     //顯示資料        
               jta1.setLineWrap(true);           //自動適應
               int r,g,b;
               jta1.setBackground(Color.white);
               jta1.setEditable(false);        
               this.add(jta1,"Center"); 
              // Font f=new Font("Dialog",Font.BOLD,12);   //
               jp1.setBackground(new java.awt.Color(128,255,128));
  }
 public void ShowData(){  
        jta1.setText("	 Max \tAllocation              Need       \tAvailable\n");       
        jta1.append("\n"+"    資源:   " + " A       B      C          " +"     A       B      C    " +
                    "        A       B      C    " +"       A       B      C");  
        jta1.append("\n    程序\n      "+pname[0]+"         " +
                           +Max[0][0]+"       "+Max[0][1]+"      "
                           +Max[0][2]+"          " +
                                  "     "+Allocation[0][0]+"       "+Allocation[0][1]
                      +"       "+Allocation[0][2]+"    " +
                                  "          "+Need[0][0]+"       "+Need[0][1]
                      +"      "+Need[0][2]+"    " +
                                  "       "+Available[0]+"       "+Available[1]+
                                  "      "+Available[2]);
        for(int i=1;i<5;i++)
        {
        jta1.append("\n\n      "+pname[i]+"    " +
                    "     "+Max[i][0]+"       "+Max[i][1]+"      "+Max[i][2]+"          " +
                           "     "+Allocation[i][0]+"       "+Allocation[i][1]
               +"       "+Allocation[i][2]+"    " +
                           "          "+Need[i][0]+"       "+Need[i][1]
               +"      "+Need[i][2]+"    " );
        }
        jtf1.setText("");
        jtf2.setText("");
        jtf3.setText("");
        jtf4.setText("");
        
 }
<span style="color: rgb(255, 0, 0); font-family: 'Microsoft YaHei';font-size:14px; line-height: 18px; background-color: rgb(248, 248, 248);">截圖:</span>


②演算法實現程式碼:
public void myAllocation(int i)   //分配資源
 {   
		   for (int j=0;j<sno;j++)
		  {
		  Available[j]=Available[j]-Request[j];
		  Allocation[i][j]=Allocation[i][j]+Request[j];
		  Need[i][j]=Need[i][j]-Request[j];
		  }
 }
 
 
 public boolean judge(int i, int Request[] )   //初步檢查是否有足夠資源   
 { 
        boolean choice=false;
        for(int j=0;j<sno;j++){
         if(Request[j]>Need[i][j]) 
        	 break;      
         if(Request[j]>Available[j]) 
        	 break;
         else choice=true;
        } 
        return choice; 
 }
 

 public boolean SaftyCheck(int p)        //安全性檢查
 { 	 
		 int k = 0;
		 boolean b=true;
		 Work=new int[sno];        //定義工作向量並賦初值
		 Finish=new boolean[pno];  
		 for(int i=0;i<sno;i++) 
		 {
		   Work[i]=Available[i]; 
		 }
		 for(int i=0;i<pno;i++) 
		 Finish[i]=false; //初值為false 
		 Finish[p]=true;  //初次檢查
		 for(int j=0;j<sno;j++)//釋放資源
		 {
			 Work[j]=Work[j]+Allocation[p][j];
		 }
		  temp[k++]=p;
		  boolean found = false;//標記是否找到安全程序 
		  
		 while(k<pno-1){       //遍歷查詢安全序列
		 for(int i=0;i<pno;i++)
	     {
		         boolean flag=true;//標記是否有足夠資源
		       if(Finish[i]) continue ; 
		       for(int j=0;j<sno;j++)
		       {            
			        if(Need[i][j]>Work[j])    //資源不足,退出
			        {
			               flag=false;
			            break;
	                }
               }
		       if(flag) //找到資源
		              {
		       		  temp[k++]=i;//儲存安全序列
		              Finish[i]=true;
		              found=true;         
		              for(int j=0;j<sno;j++)//釋放資源
		               Work[j]=Work[j]+Allocation[i][j];
		              }   
         }
			    if(found) 
			    {
				  found=false;
			    }
			    else break;//遍歷,試分配失敗跳出 
			 }
		 
		 for(int i=0;i<pno;i++){    //若存在false,則跳出
		        if(!Finish[i])
		         {
		               b=false;
		               break;
		             }
		 }
		 return b;
	}

截圖:


③事件響應函式:
public void actionPerformed(ActionEvent e) {
//事件響應函式
       if(e.getSource()==jb1){//按下“確定”            
              if(jcb1.getSelectedItem()=="Request"){             
              int p=0;         
        try{
              p=Integer.parseInt(jtf1.getText());
              Request[0]=Integer.parseInt(jtf2.getText());
              Request[1]=Integer.parseInt(jtf3.getText());
              Request[2]=Integer.parseInt(jtf4.getText());
        }catch(Exception d)
        {
               JOptionPane.showMessageDialog(this, "您輸入有誤!請重新輸入!");
               ShowData();
               return;
        }
        if(p>4) //限定輸入程序ID範圍
               {
               JOptionPane.showMessageDialog(this, "PID在0-4之間!");
               jtf1.setText("");
               return;
               }
              if(judge(p,Request))//初步分配檢查
              {                  
                     if(SaftyCheck(p)){//安全性檢查                  
                    	     ShowData();
                             jta1.append("\n\n  通過安全性檢查!安全序列為:");
                             for(int i=0;i<pno;i++)//列印安全序列
                             jta1.append("P"+String.valueOf(temp[i])+" ");
                             jta1.append("  批准請求,資源已分配!");
                             myAllocation(p);//檢查到安全序列才分配
                     }else //不安全
                            {                         
                    	 			ShowData();
                                    //jta1.append("\n\n   找不到安全序列!   不批准請求!");
                                    JOptionPane.showMessageDialog(this, "找不到安全序列!   不批准請求!");
                            }
              }else{
            	     ShowData();
                     jta1.append("\n\n  系統資源不足!"); 
              }           
       }
      /***
       * 選擇avaliable時!        
       */
              
       
        else if(jcb1.getSelectedItem()=="Available"){//設定可用資源  
              try{
                     Available[0]= Integer.parseInt(jtf2.getText());
                     Available[1]=Integer.parseInt(jtf3.getText());
                     Available[2]=Integer.parseInt(jtf4.getText());
        }catch(Exception d)
        {
               JOptionPane.showMessageDialog(this, "您輸入有誤!請重新輸入!");
               ShowData();
               return;
        }
            ShowData();   
           jta1.append("\n\n    可用資源設定成功!");       
       }
      
              /**
       * 選擇Max時! 
       */
        
      else if(jcb1.getSelectedItem()=="Max"){//設定最大需求源            
              int p = 0;       
              try{
                     p =Integer.parseInt(jtf1.getText());
                     if(p>4)
               {
                      JOptionPane.showMessageDialog(this, "程序ID在0-4之間!");
                      jtf1.setText("");
                      return;
                      }    
                     int Maxago[][]= new int[pno][sno];   //暫存最大需求                              
                     Max[p][0]=Integer.parseInt(jtf2.getText());
                     Max[p][1]=Integer.parseInt(jtf3.getText());
                     Max[p][2]=Integer.parseInt(jtf4.getText());               

                     for(int j=0;j<sno;j++){      //判斷設定是否合理
                                   int temp =Max[p][j]-Allocation[p][j];
                                   if(temp>=0)
                                   Need[p][j]=temp;
                                   else
                                   {
                                          JOptionPane.showMessageDialog(this, "最大需求過小!請重新輸入!");
                                           Max=Maxago;
                                           ShowData();
                                           return;
                                   }                                       
                            }                  
        }catch(Exception d)
        {
               JOptionPane.showMessageDialog(this, "輸入有誤!請重新輸入!");
               ShowData();
               return;
        }   
        	ShowData();                 
	        jta1.append("\n\n  最大需求設定成功!"); 
       }
          
              
      /**
        * 選擇Allocation時!
        */
              
        else if(jcb1.getSelectedItem()=="Allocation"){//設定已分配資源
            int p = 0;
            try{
            	 p =Integer.parseInt(jtf1.getText());
                 if(p>4)
                 {
                  JOptionPane.showMessageDialog(this, "程序ID在0-4之間!");
                  jtf1.setText("");
                  return;
                  }                                   
                 Allocation[p][0]=Integer.parseInt(jtf2.getText());
                 Allocation[p][1]=Integer.parseInt(jtf3.getText());
                 Allocation[p][2]=Integer.parseInt(jtf4.getText());}
              catch(Exception d)
              {
                     JOptionPane.showMessageDialog(this, "輸入有誤!請重新輸入!");
                     ShowData();
                     return;
              }   
              ShowData();                 
              jta1.append("\n\n 已分配資源設定成功!"); 
             }

          }      

截圖: