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 + ": 完成任务。----】");
}
}
Java 银行家算法的更多相关文章
- Java银行家算法
实验存档,代码特别烂.. 测试.java package operating.test; import operating.entity.bank.Bank; import operating.ent ...
- 银行家算法java实现
关于银行家算法的理论知识,课本或者百度上有好多资料,我就不再多说了,这里把我最近写的银行家算法的实现带码贴出来. 由于这是我们的一个实验,对系统资源数和进程数都指定了,所以这里也将其指定了,其中系统资 ...
- 预防和避免死锁的方法及银行家算法的java简单实现
预防死锁 (1) 摒弃"请求和保持"条件 基本思想:规定所有进程在开始运行之前,要么获得所需的所有资源,要么一个都不分配给它,直到所需资源全部满足才一次性分配给它. 优点:简单.易 ...
- java面试题之死锁产生的条件,以及如何避免死锁,银行家算法,产生死锁后如何解决(阿里面试题)
死锁产生的四个必要条件: 互斥:一个资源每次只能被一个进程使用(资源独立) 请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放(不释放锁) 不剥夺:进程已获得的资源,在未使用之前,不能强行 ...
- c/c++多线程模拟系统资源分配(并通过银行家算法避免死锁产生)
银行家算法数据结构 (1)可利用资源向量Available 是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目.如果Available[j]=K,则表示系统中现有Rj类资源K个. (2) ...
- 史上最全的java随机数生成算法分享(转)
这篇文章主要介绍了史上最全的java随机数生成算法,我分享一个最全的随机数的生成算法,最代码的找回密码的随机数就是用的这个方法 String password = RandomUtil.generat ...
- 常用Java排序算法
常用Java排序算法 冒泡排序 .选择排序.快速排序 package com.javaee.corejava; public class DataSort { public DataSort() { ...
- Round() 四舍五入 js银行家算法(转)
首先问一下round(0.825,2) 返回的结果,大家猜一猜, 首先SQL server 返回的是 0.83 js的返回结果 是0.83,code 如下: var b = 0.825; ...
- 使用Java练习算法常用的基本操作
一.使用Java练习算法常常需要使用控制台的数据输入和输出,下面记录一下基本的使用方法: 基本用法 import java.util.*; public class Main { public sta ...
随机推荐
- Hibernate级联之一对多和inverse解析
hibernate的级联可以说是hibernate最重要的部分,只有深入了解了级联的特性与用法,才能运用自如. 这次讨论一对多的情况,所以就使用博客项目的用户表和博客表作为示例,来一起学习hibern ...
- 圆形的ImageView
转载自gitHub的ImageView,因为本身就是可用的,也没什么好说的,拷贝回去用就是了,可以设置除了背景,还可以设置边框什么的,比起CardView设置圆角,功能更加强大. import and ...
- scala时间处理
1.获取当前时间的年份.月份.天.小时等等 val nowDay=LocalDate.now().getDayOfMonth val nowDay=LocalTime.now().getHour 2. ...
- Jackson将json string转为Object,org.json读取json数组
从json文件读取json string或者自定义json string,将其转为object.下面采用的object为map,根据map读取json的某个数据,可以读取第一级的数据name,后来发现 ...
- “玲珑杯”ACM比赛 Round #22 E 贪心,脑洞
1171 - 这个E大概是垃圾桶捡来的 Time Limit:2s Memory Limit:128MByte Submissions:138Solved:45 DESCRIPTION B君在做 CO ...
- 数据库索引------B-Tree 索引和 Hash 索引的对比
对于 B-tree 和 hash 数据结构的理解能够有助于预测不同存储引擎下使用不同索引的查询性能的差异,尤其是那些允许你选择 B-tree 或者 hash 索引的内存存储引擎. B-Tree 索引的 ...
- LVM挂载失败mount: you must specify the filesystem type
因意外原因导致机器重启,机器起来后发现磁盘挂载没有了,挂载,结果报错 [root@all /]# mount /dev/hdc2 /mnt/cdrom mount: you must specify ...
- Vux配置指南
流程 Vux是Vue.js的一个ui库,官网在这里,官方文档的配置指南侧重于技术的罗列,我这里简化一下Vux的配置流程. 1. 安装vux npm install vux --save 2. 安装le ...
- Java学习之计算机基础(一)
阅读本文大概需要 4 分钟 想要开始学习Java开发,需要掌握一些必要的计算机基础.如果你是计算机专业的人或者已经学过类似的课程,可以跳过这篇文章的阅读.计算机基础课程有很多,小编在大学里学过的课程就 ...
- Windows下Tomcat调优
windows tomcat 优化 1. tomcat conf server.xml 在server.xml中修改以一部分,增加节点数目,可以很好的提高性能: <Connector port ...