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; }