首页 > 编程语言 > 详细

Java 银行家算法

时间:2017-12-06 23:39:47      阅读:235      评论:0      收藏:0      [点我收藏+]

实验存档,代码特别烂。。

测试.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 + ": 完成任务。----】");
    }
}

 

Java 银行家算法

原文:http://www.cnblogs.com/xkxf/p/7994912.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!