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

测试.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. 十一、Hadoop学习笔记————数据库与数据仓库

    数据仓库是集成的面向主题的数据库的集合 面向主题主要是宏观上解决某一类问题,集合性指数据集 数据库主要处理用于事务处理,数据仓库用于分析处理,数据库适用于操作型数据,便于增删改查, 数据仓库则用于挖掘 ...

  2. php垃圾回收

    php所有的变量都存在一个zval的结构里面,通过refcount和is_ref来存储变量的引用关系.refcount是变量的引用次数,is_ref是变量是否被引用,当is_ref=0的时候refco ...

  3. Python简单爬虫

    爬虫简介 自动抓取互联网信息的程序 从一个词条的URL访问到所有相关词条的URL,并提取出有价值的数据 价值:互联网的数据为我所用 简单爬虫架构 实现爬虫,需要从以下几个方面考虑 爬虫调度端:启动爬虫 ...

  4. selenium定位tr及td,并获取其文本及属性

    #获取所有的trtrlist=brower.find_elements_by_tag_name("tr")for tr in trlist: #获取tr中的所有td tdlist= ...

  5. 物联网蓝牙模块:DA14586蓝牙5模块很快到来

    Dialog半导体的SmartBond系列的下一代产品---DA14586已经发布.该全新的系统级芯片(SoC)是公司首款支持最新蓝牙5.0规范的独立器件,为先进应用提供最低的功耗和无可比拟的功能. ...

  6. 【转】Nginx反向代理和负载均衡

    原文链接:http://www.cnblogs.com/shuoer/p/7820899.html Nginx反向代理和负载均衡 环境说明 由于我使用的是windows系统,所以我用虚拟机虚拟出来了3 ...

  7. WebRTC介绍及简单应用

    WebRTC介绍及简单应用 WebRTC,即Web Real-Time Communication,web实时通信技术.简单地说就是在web浏览器里面引入实时通信,包括音视频通话等. WebRTC实时 ...

  8. [WPF]本地化入门

    1. 前言 WPF的本地化是个很常见的功能,我做过的WPF程序大部分都实现了本地化(不管最终有没有用到).通常本地化有以下几点需求: 在程序启动时根据CultureInfo.CurrentUICult ...

  9. 360提供的php防注入代码

    <?php //Code By Safe3 function customError($errno, $errstr, $errfile, $errline) { echo "< ...

  10. 【Spring】多数据源导致自动化配置失败问题

    一.问题描述 笔者根据需求在开发过程中,需要在原项目的基础上(单数据源),新增一个数据源C,根据C数据源来实现业务.至于为什么不新建一个项目,大概是因为这只是个小功能,访问量不大,不需要单独申请个服务 ...