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("");

}

截图:

②算法实现代码:

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 已分配资源设置成功!");

}

}

截图:

以上是 java实现银行家算法(Swing界面) 的全部内容, 来源链接: utcz.com/z/323427.html

回到顶部