Java銀行家算法


實驗存檔,代碼特別爛。。

測試.java

package operating.test;

import operating.entity.bank.Bank;
import operating.entity.bank.EngineeringTeam;

public class TestBank {
    public static void main(String[] args) {
        Bank bank = new Bank(10);
        for (int i = 0; i != 3; ++i) {
            new Thread(new EngineeringTeam(5, bank)).start();
        }
    }
}

/

銀行.java

package operating.entity.bank;

import java.util.ArrayList;

public class Bank {
    /**
     * 工程隊數量
     */
    private static final int NUM = 3;
    /**
     * 當前可用的資金數目
     */
    private int available;
    /**
     * 已分配矩陣
     */
    private int[] allocation = new int[NUM];
    /**
     * 需求矩陣
     */
    private int[] need = new int[NUM];

    public Bank(int available) {
        this.available = available;
    }

    /**
     * 向銀行借錢
     * @param id 工程隊id
     * @param request 工程隊需求資金
     * @return 一個布爾值,如果借錢成功返回真,否則返回假
     */
    public synchronized boolean borrow(int id, int request) {
        System.out.println("銀行還剩 " + available + " 萬元。");
        if (request <= need[id]) {
            if (request <= available) {
                int temp1 = available;
                int temp2 = allocation[id];
                int temp3 = need[id];
                // 試探借錢
                available = available - request;
                allocation[id] = allocation[id] + request;
                need[id] = need[id] - request;
                // 安全檢查
                if (check()) {
                    System.out.println("工程隊" + id + ": 借 " + request + " 萬元成功。");
                    return true;
                } else {
                    // 不能借,撤銷操作
                    available = temp1;
                    allocation[id] = temp2;
                    need[id] = temp3;
                }
            }
        }
        System.out.println("工程隊" + id + ": 借 " + request + " 萬元失敗。");
        return false;
    }

    /**
     * 安全檢查
     * @return 當前狀態為安全狀態返回真,否則返回假。
     */
    private boolean check() {
        int work = available;
        boolean[] finish = new boolean[NUM];
        for (int i = 0; i != finish.length; ++i) {
            finish[i] = false;
        }

        for (int i = 0; i != NUM; ++i) {
            for (int j = 0; j != NUM; ++j) {
                if (!finish[j] && need[j] <= work) {
                    work = work + allocation[j];
                    finish[j] = true;
                }
            }
        }

        boolean flag = true;
        for (int i = 0; i != NUM; ++i) {
            flag = flag && finish[i];
        }
        return flag;
    }

    /**
     * 添加工程隊
     * @param team
     */
    public void addTeam(EngineeringTeam team) {
        int id = team.getId();
        need[id] = team.getNeed();
    }

    /**
     * 工程隊還錢
     * @param money
     */
    public void payBack(int money) {
        available = available + money;
    }
}

/

借錢的工程隊.java

package operating.entity.bank;

import org.omg.CORBA.INTERNAL;

public class EngineeringTeam implements Runnable {
    /**
     * 工程隊總數
     */
    private static int total = 0;
    /**
     * 工程隊 id
     */
    private int id;
    /**
     * 完成工程還需要的資金數量
     */
    private int need;
    /**
     * 目標資金
     */
    private int max;
    /**
     * 目標銀行
     */
    private Bank bank;

    public EngineeringTeam(int need, Bank bank) {
        id = total++;
        this.need = max = need;
        this.bank = bank;
        this.bank.addTeam(this);
    }

    public int getId() {
        return id;
    }

    public int getNeed() {
        return need;
    }

    /**
     * 不停借錢直到完成
     */
    @Override
    public void run() {
        while (need > 0) {
            System.out.println("工程隊" + id + ": 還缺 " + need + " 萬元。");
            // 隨機借錢
            int request = (int)(Math.random()*need) + 1;
            if (bank.borrow(id, request)) need -= request;

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        bank.payBack(max);
        System.out.println("【----工程隊" + id + ": 完成任務。----】");
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM