java實現(xiàn)銀行家算法(Swing界面)
更新時間:2019年12月26日 11:19:38 作者:竹啟
這篇文章主要為大家詳細介紹了銀行家算法的java代碼實現(xiàn),Swing寫的界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
java代碼實現(xiàn)了銀行家算法,界面寫的個人認為還是較為細致的,完整的實現(xiàn)了找安全序列等算法功能,可作為參考學習銀行家算法。
直接上代碼:①界面展示方法:
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("");
}
截圖:

②算法實現(xiàn)代碼:
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 系統(tǒng)資源不足!");
}
}
/***
* 選擇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 已分配資源設置成功!");
}
}
截圖:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
mybatis-plus讀取JSON類型的方法實現(xiàn)
這篇文章主要介紹了mybatis-plus讀取JSON類型的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09
Maven發(fā)布封裝到中央倉庫時候報錯:no default secret key
這篇文章主要介紹了Maven發(fā)布封裝到中央倉庫時候報錯:no default secret key,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12
EventBus與Spring Event區(qū)別詳解(EventBus 事件機制,Spring Event事件機制)
這篇文章主要介紹了EventBus與Spring Event區(qū)別,需要的朋友可以參考下2020-02-02
Spring超詳細講解創(chuàng)建BeanDefinition流程
Spring在初始化過程中,將xml中定義的對象解析到了BeanDefinition對象中,我們有必要了解一下BeanDefinition的內部結構,有助于我們理解Spring的初始化流程2022-06-06

