📄 bank.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 + -