• 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 + ": 完成任务。----】");
        }
    }
  • 相关阅读:
    hbase存储优化
    cloudera manager下phoenix的安装
    Cloudera manager的服务安装以及spark升级到2.2
    redis学习总结
    kylin基础概念和基础性能优化
    mycat使用注意事项
    kylin2.0环境搭建
    ETL实践--kettle转到hive
    集成 SOLR 到 TOMCAT 中(傻瓜教程)
    局域网ip扫描
  • 原文地址:https://www.cnblogs.com/xkxf/p/7994912.html
Copyright © 2020-2023  润新知