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

测试.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. Java Web项目--使用JSP生成一个页面

    我们使用了servlet生成了一个网页,但是可以看到使用servlet生成网页必须将网页的内容全部嵌入到Java代码当中,不是很方便.所以有没有什么办法是将Java代码嵌入到html代码中,而不是像s ...

  2. Spring学习笔记--自动检测

    要使用自动检测,我们需要用到<context:annotation-scan>标签.<context:annotation-scan>元素除了完成与<context:an ...

  3. jquery对象转dom对象

    jq取兄弟级的上移个元素 jquery对象: var a = $(this).prev("a"); console.log(a); 输出: 转dom对象: var a = $(th ...

  4. HDU 5900 QSC and Master

    题目链接:传送门 题目大意:长度为n的key数组与value数组,若相邻的key互斥,则可以删去这两个数同时获得对应的两 个value值,问最多能获得多少 题目思路:区间DP 闲谈: 这个题一开始没有 ...

  5. JZOJ.5315【NOIP2017模拟8.19】小串串

    Description

  6. python里的生成器

    author:headsen chen date:2018-03-22 10:59:46 notice:This article created by headsen chen himself and ...

  7. ios UITableView高度自适应(转)

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // ...

  8. [Gradle] 针对不同的项目类型应用不同的 findbugs 配置

    build.gradle in project root subprojects { subProject -> plugins.withId('com.android.application' ...

  9. Ubuntu 14.04 安装jdk,tomcat

     分类: 碎知识(8)  版权声明:本文为博主原创文章,未经博主允许不得转载. 写在前面: 装的时候,参考了许多网上的资料,有很多人写的有些简单了,人家那边版本稍微一更新,像我这样的小白就找不到东南西 ...

  10. Drainage Ditches---hdu1532(最大流, 模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 最大流模板题: EK:(复杂度为n*m*m); #include<stdio.h> ...