代碼清單
public class Banker {
public static void main(String[] args) {
View view = new View();
view.show();
}
}
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Vector;
public class View extends JFrame{
private Work work;
private DefaultTableModel tableModel;
private final String[] COLUMN_NAME = new String[] {"進程名","Max","Allocation","Need"};
private JButton joinBtn;
private JTextField resIDJF;
private JTextField resAJF;
private JTextField resBJF;
private JTextField resCJF;
private JComboBox<String> jcb;
private JLabel rAvLB;
public View() {
setupUI();
addActionListener();
work = new Work();
this.setSize(new Dimension(800,480));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void setupUI() {
this.setTitle("銀行家算法");
this.setLayout(new BorderLayout());
String[][] rowData = new String[][]{};
tableModel = new DefaultTableModel();
tableModel.setDataVector(rowData, COLUMN_NAME);
JTable processTable = new JTable(tableModel);
JScrollPane scrollPane = new JScrollPane(processTable);
this.add(scrollPane,BorderLayout.CENTER);
JPanel bottomPanel = new JPanel(new GridLayout(1,0));
String s[]= {"Available","Max","Allocation","Request","Delete"};
jcb=new JComboBox<String>(s);
JLabel resID = new JLabel("pID: ");
resIDJF = new JTextField(1);
resIDJF.setEditable(false);
JLabel resA = new JLabel("A: ");
resAJF = new JTextField(1);
JLabel resB = new JLabel("B: ");
resBJF = new JTextField(1);
JLabel resC = new JLabel("C: ");
resCJF = new JTextField(1);
joinBtn = new JButton("確定");
bottomPanel.add(jcb);
bottomPanel.add(resID);
bottomPanel.add(resIDJF);
bottomPanel.add(resA);
bottomPanel.add(resAJF);
bottomPanel.add(resB);
bottomPanel.add(resBJF);
bottomPanel.add(resC);
bottomPanel.add(resCJF);
bottomPanel.add(joinBtn);
this.add(bottomPanel,BorderLayout.SOUTH);
JPanel rJp = new JPanel(new GridLayout(2,1));
JLabel rlb = new JLabel("Available");
rAvLB = new JLabel("0 0 0");
rJp.add(rlb);
rJp.add(rAvLB);
this.add(rJp,BorderLayout.EAST);
}
private void addActionListener() {
joinBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(jcb.getSelectedItem());
if(jcb.getSelectedItem() == "Available") {
work.setAvailable(Integer.parseInt(resAJF.getText()), Integer.parseInt(resBJF.getText()), Integer.parseInt(resCJF.getText()));
}
else if(jcb.getSelectedItem() == "Max") {
work.setMax(Integer.parseInt(resIDJF.getText()),Integer.parseInt(resAJF.getText()), Integer.parseInt(resBJF.getText()), Integer.parseInt(resCJF.getText()));
}
else if(jcb.getSelectedItem() == "Allocation") {
work.setAlloction(Integer.parseInt(resIDJF.getText()),Integer.parseInt(resAJF.getText()), Integer.parseInt(resBJF.getText()), Integer.parseInt(resCJF.getText()));
work.calcuAN(Integer.parseInt(resIDJF.getText()));
}
else if(jcb.getSelectedItem() == "Request") {
work.setRequest(Integer.parseInt(resIDJF.getText()),Integer.parseInt(resAJF.getText()), Integer.parseInt(resBJF.getText()), Integer.parseInt(resCJF.getText()));
}
else if(jcb.getSelectedItem() == "Delete") {
work.deleteProcess(Integer.parseInt(resIDJF.getText()));
}
update();
resAJF.setText("");
resBJF.setText("");
resCJF.setText("");
resIDJF.setText("");
}
});
jcb.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) {
if(e.getItem() == "Available") {
resIDJF.setEditable(false);
}
else if(e.getItem() == "Delete") {
resIDJF.setEditable(true);
resAJF.setEditable(false);
resBJF.setEditable(false);
resCJF.setEditable(false);
}
else {
resIDJF.setEditable(true);
resAJF.setEditable(true);
resBJF.setEditable(true);
resCJF.setEditable(true);
}
}
}
});
}
private void update() {
String[][] data = work.getData();
tableModel.setDataVector(data, COLUMN_NAME);
String[] avData = work.getAvData();
rAvLB.setText(avData[0]+" "+avData[1]+" "+avData[2]);
}
}
public class Work {
int[] Available = {0, 0, 0};
int[][] Max = new int[4][3];
int[][] Alloction = new int[4][3];
int[][] Need = new int[4][3];
int[][] Request = new int[4][3];
int[] Work = new int[3];
int num = 0;
public Work() {
}
public void setAvailable(int a,int b,int c) {
Available[0]=a;
Available[1]=b;
Available[2]=c;
}
public void setMax(int num,int a,int b,int c) {
Max[num][0]=a;
Max[num][1]=b;
Max[num][2]=c;
}
public void setAlloction(int num,int a,int b,int c) {
Alloction[num][0]=a;
Alloction[num][1]=b;
Alloction[num][2]=c;
}
public void calcuAN(int num) {
for (int i = 0; i < 3; i++) {
Available[i] = Available[i] - Alloction[num][i];
}
for (int j = 0; j < 3; j++) {
Need[num][j] = Max[num][j] - Alloction[num][j];
}
}
public String[][] getData(){
String[][] res = new String[4][4];
for(int i=0;i<4;i++){
res[i][0]="P"+i;
for(int j=0;j<3;j++){
if(j==0)
res[i][1]=Max[i][j]+" ";
else
res[i][1]+=Max[i][j]+" ";
}
for(int j=0;j<3;j++){
if(j==0)
res[i][2]=Alloction[i][j]+" ";
else
res[i][2]+=Alloction[i][j]+" ";
}
for(int j=0;j<3;j++){
if(j==0)
res[i][3]=Need[i][j]+" ";
else
res[i][3]+=Need[i][j]+" ";
}
}
return res;
}
public String[] getAvData() {
String[] res = new String[3];
for(int i=0;i<3;i++) {
res[i]=Available[i]+"";
}
return res;
}
public void setRequest(int num,int a,int b,int c) {
Request[num][0] = a;
Request[num][1] = b;
Request[num][2] = c;
System.out.println("即進程P" + num + "對各資源請求Request:(" + Request[num][0] + "," + Request[num][1] + "," + Request[num][2] + ").");
BankerAlgorithm(num);
}
public void BankerAlgorithm(int num) {
boolean T=true;
if (Request[num][0] <= Need[num][0] && Request[num][1] <= Need[num][1] && Request[num][2] <= Need[num][2]) {
if (Request[num][0] <= Available[0] && Request[num][1] <= Available[1] && Request[num][2] <= Available[2]) {
for (int i = 0; i < 3; i++) {
Available[i] -= Request[num][i];
Alloction[num][i] += Request[num][i];
Need[num][i] -= Request[num][i];
}
System.out.println(Available[0]+" "+Available[1]+" "+Available[2]);
} else {
JOptionPane.showMessageDialog(null, "當前沒有足夠的資源可分配,進程P" + num + "需等待。", "檢查結果",JOptionPane.INFORMATION_MESSAGE);
T=false;
}
} else {
JOptionPane.showMessageDialog(null, "進程P" + num + "請求已經超出最大需求量Need.", "檢查結果",JOptionPane.INFORMATION_MESSAGE);
T=false;
}
if(T==true){
SecurityAlgorithm();
}
}
public void SecurityAlgorithm() {
boolean[] Finish = {false, false, false,false};
int count = 0;
int circle=0;
int[] S=new int[4];
for (int i = 0; i < 3; i++) {
Work[i] = Available[i];
}
boolean flag = true;
while (count < 4) {
if(flag){
flag = false;
}
for (int i = 0; i < 4; i++) {
if (Finish[i]==false&&Need[i][0]<=Work[0]&&Need[i][1]<=Work[1]&&Need[i][2]<=Work[2]) {
Finish[i]=true;
S[count]=i;
count++;
}
}
circle++;
if(count==4){
String message = new String();
message="此時存在一個安全序列:";
for (int i = 0; i<4;i++){
message+="P"+S[i]+" ";
}
message+="故當前可分配!";
JOptionPane.showMessageDialog(null, message, "檢查結果",JOptionPane.INFORMATION_MESSAGE);
break;
}
if(count<circle){
count=5;
JOptionPane.showMessageDialog(null, "當前系統處於不安全狀態,故不存在安全序列。", "檢查結果",JOptionPane.INFORMATION_MESSAGE);
break;
}
}
}
public void deleteProcess(int num) {
for(int i=0;i<3;i++) {
Available[i]+=Alloction[num][i];
Max[num][i]=0;
Alloction[num][i]=0;
Need[num][i]=0;
Request[num][i]=0;
}
}
}
效果