JAVA Swing 銀行家算法模擬程序

代碼清單

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() {
		// TODO 自動生成的構造函數存根
		setupUI();
		addActionListener();
		work = new Work();
		this.setSize(new Dimension(800,480));
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	private void setupUI() {
		// global
		this.setTitle("銀行家算法");
		this.setLayout(new BorderLayout());
		
		// CenterLayout
		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);
		
		//BottomLayout
        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);
        
        // RightLayout
        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) {
				// TODO 自動生成的方法存根
				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) {
				// TODO 自動生成的方法存根
				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() {
    	
    }
    /**
     * 設置系統空閒資源矩陣
     * @param a第一種資源數量
     * @param b第二種資源數量
     * @param c第三種資源數量
     */
    public void setAvailable(int a,int b,int c) {
    	Available[0]=a;
    	Available[1]=b;
    	Available[2]=c;
    }
    /**
     * 設置最大需求矩陣
     * @param num進程號
     * @param a需要第一種資源的數量
     * @param b需要第二種資源的數量
     * @param c需要第三種資源的數量
     */
    public void setMax(int num,int a,int b,int c) {
        Max[num][0]=a;
        Max[num][1]=b;
        Max[num][2]=c;
    }
    /**
     * 設置已分配資源矩陣
     * @param num進程號
     * @param a已分配第一種資源的數量
     * @param b已分配第二種資源的數量
     * @param c已分配第三種資源的數量
     */
    public void setAlloction(int num,int a,int b,int c) {
        Alloction[num][0]=a;
        Alloction[num][1]=b;
        Alloction[num][2]=c;
    }
    /**
     * 計算Allocation矩陣和Need矩陣
     * @param num進程號
     */
    public void calcuAN(int num) {
    	for (int i = 0; i < 3; i++) {//設置Alloction矩陣
    		Available[i] = Available[i] - Alloction[num][i];
        }
    	for (int j = 0; j < 3; j++) {
    		Need[num][j] = Max[num][j] - Alloction[num][j];
    	}
    }
    /**
     * 獲取Max、Allocation、Need矩陣的數據
     * @return 返回string二維數組給界面函數更新列表
     */
    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;
    }
    /**
     * 獲取Available矩陣數據
     * @return 返回string數組給界面函數更新列表
     */
    public String[] getAvData() {
    	String[] res = new String[3];
    	for(int i=0;i<3;i++) {
    		res[i]=Available[i]+"";
    	}
    	return res;
    }
    /**
     * 設置申請矩陣
     * @param num進程號
     * @param a申請第一種資源的數量
     * @param b申請第二種資源的數量
     * @param c申請第三種資源的數量
     */
    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);
    }
    /**
     * 銀行家算法
     * @param 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};//初始化Finish
        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++;//滿足進程數加1
                }

            }
            circle++;//循環數加1

            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;
            }
        }
    }
    /**
     * 刪除進程方法
     * @param num進程號
     */
    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;
    	}
    }
}

效果

在這裏插入圖片描述

發佈了26 篇原創文章 · 獲贊 19 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章