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 ...
随机推荐
- TFboy养成记 简单小程序(Variable & placeholder)
学习参考周莫烦的视频. Variable:主要是用于训练变量之类的.比如我们经常使用的网络权重,偏置. 值得注意的是Variable在声明是必须赋予初始值.在训练过程中该值很可能会进行不断的加减操作变 ...
- Bin、App_Data等文件夹详述(转自http://blog.csdn.net/zzjiadw/article/details/6801506)
ASP.NET应用程序和ASP.Net网站所共有的文件: App_Browsers 包含 ASP.NET 用于标识个别浏览器并确定其功能的浏览器定义 (.browser) 文件.有关更多信息,请参见浏 ...
- 4. 跟踪标记 (Trace Flag) 610 对索引组织表(IOT)最小化日志
跟踪标记:610 功能: 用批量导入操作(Bulk Import Operations)加载数据时,对于索引组织表(即有聚集索引的表) 最小化日志: 上图为simple/bulk-logged恢复模式 ...
- [react] React 新手必须知道的 N 件事
尽量用 props & onChange,不要用 ref 获取引用然后调用方法.详情参考我的文章:一等公民 props & onChange React 只是一个视图框架,请尽量在 C ...
- Python之三目运算符
Python语言不像Java.JavaScript等这些语言有类似: 判段的条件?条件为真时的结果:条件为假时的结果 这样的三目运算,但是Python也有自己的三目运算符: 条件为真时的结果 if 判 ...
- ThinkPHP中处理验证码的问题
Think\Verify类可以支持验证码的生成和验证功能. 生成验证码的最简单的代码如下: public function verify(){ $Verify = new \Think\ ...
- zanphp 初探----安装篇
安装 zanphp 的安装详细步骤具体在 http://zanphpdoc.zanphp.io/,但是安装的时候,还是踩了一些坑,Mac 和 Ubuntu 我都安装过, 分享大家注意一下. PHP 版 ...
- codeforces 883M. Quadcopter Competition 思路
M. Quadcopter Competition time limit per test 3 seconds memory limit per test 256 megabytes input st ...
- 数据库服务器---Tps
事务处理系统:Transactionprocessingsystems(TPS) 提高事务处理效率与保证其正确性 在数据(信息)发生处将它们记录下来 通过OLTP产生新的信息 将信息保存到数据库中供其 ...
- LVM挂载失败mount: you must specify the filesystem type
因意外原因导致机器重启,机器起来后发现磁盘挂载没有了,挂载,结果报错 [root@all /]# mount /dev/hdc2 /mnt/cdrom mount: you must specify ...