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 + ": 完成任务。----】");
    }
}
复制代码

 

posted @   xkfx  阅读(3690)  评论(2编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2016-12-06 c trans
点击右上角即可分享
微信分享提示