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

测试.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银行家算法的更多相关文章

  1. Java 银行家算法

    实验存档,代码特别烂.. 测试.java package operating.test; import operating.entity.bank.Bank; import operating.ent ...

  2. 银行家算法java实现

    关于银行家算法的理论知识,课本或者百度上有好多资料,我就不再多说了,这里把我最近写的银行家算法的实现带码贴出来. 由于这是我们的一个实验,对系统资源数和进程数都指定了,所以这里也将其指定了,其中系统资 ...

  3. 预防和避免死锁的方法及银行家算法的java简单实现

    预防死锁 (1) 摒弃"请求和保持"条件 基本思想:规定所有进程在开始运行之前,要么获得所需的所有资源,要么一个都不分配给它,直到所需资源全部满足才一次性分配给它. 优点:简单.易 ...

  4. java面试题之死锁产生的条件,以及如何避免死锁,银行家算法,产生死锁后如何解决(阿里面试题)

    死锁产生的四个必要条件: 互斥:一个资源每次只能被一个进程使用(资源独立) 请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放(不释放锁) 不剥夺:进程已获得的资源,在未使用之前,不能强行 ...

  5. c/c++多线程模拟系统资源分配(并通过银行家算法避免死锁产生)

    银行家算法数据结构 (1)可利用资源向量Available 是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目.如果Available[j]=K,则表示系统中现有Rj类资源K个. (2) ...

  6. 史上最全的java随机数生成算法分享(转)

    这篇文章主要介绍了史上最全的java随机数生成算法,我分享一个最全的随机数的生成算法,最代码的找回密码的随机数就是用的这个方法 String password = RandomUtil.generat ...

  7. 常用Java排序算法

    常用Java排序算法 冒泡排序 .选择排序.快速排序 package com.javaee.corejava; public class DataSort { public DataSort() { ...

  8. Round() 四舍五入 js银行家算法(转)

    首先问一下round(0.825,2) 返回的结果,大家猜一猜, 首先SQL server 返回的是 0.83 js的返回结果 是0.83,code 如下: var b = 0.825;        ...

  9. 使用Java练习算法常用的基本操作

    一.使用Java练习算法常常需要使用控制台的数据输入和输出,下面记录一下基本的使用方法: 基本用法 import java.util.*; public class Main { public sta ...

随机推荐

  1. Myeclipse下使用Maven搭建spring boot项目(第二篇)

    现在需要搭建spring boot框架,并实现一个HelloWorld的项目,让程序真正运行起来. 一.在pom.xml中引入spring-boot-start-parent,spring官方的叫st ...

  2. jqgrid自动换行

    JQGrid表头自动换行的办法: 如果table的header部分字段太多或字段文字太长需要自动换行时,可尝试如下css. <style type="text/css" me ...

  3. maven仓库加载本地包依赖

    如果有个jar包是我们自己打的,怎么放到maven中呢? 首先在项目里面新建一个lib目录,如果有lib目录则不需要新建,然后放自己的jar包进去,maven的pom.xml配置是: <depe ...

  4. iOS中navigationItem修改标题的颜色

    UIColor * color = [UIColor redColor];//这里我们设置的是颜色,NSDictionary * dict = [NSDictionary dictionaryWith ...

  5. node.js使用require给flume提交请求

      node.js使用require给flume提交请求 - 简书 https://www.jianshu.com/p/02c20e2d011a     玄月府的小妖在debug 关注 2017.04 ...

  6. flask建立数据模型数据类型

    https://blog.csdn.net/happyanger6/article/details/53947162 https://blog.csdn.net/happyanger6/article ...

  7. Flowers---hdu4325(区间处理 离散化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4325 题意:有n种花,每种花都有自己的开花时间段从S到E,有m个查询,每个查询都是一个时间点,求这一时 ...

  8. 软中断和tasklet介绍

    今天看了下tasklet,重点分析了其和软中断的关系,特此记录 关于软中断,在之前的中断文章中已经有所介绍,这里就不多说了,只是说明下,系统中默认支持32种软中断,而实际上系统定义的软中断仅有以下几种 ...

  9. Unity系统自带函数生命周期以及相互关系

    官方参考手册:http://docs.unity3d.com/Manual/ExecutionOrder.html unity脚本从唤醒到销毁都有着一套比较完善的生命周期,添加任何脚本都要遵守生命周期 ...

  10. Design Patterns Example Code (in C++)

    Overview Design patterns are ways to reuse design solutions that other software developers have crea ...