关于银行家算法的理论知识,课本或者百度上有好多资料,我就不再多说了,这里把我最近写的银行家算法的实现带码贴出来。

由于这是我们的一个实验,对系统资源数和进程数都指定了,所以这里也将其指定了,其中系统资源数为3,进程数为5.

import java.util.Scanner;

import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;
import javax.swing.text.StyledEditorKit.ForegroundAction; public class Banker {
static int available[]=new int[3]; //资源数
static int max[][]=new int[5][3]; //最大需求
static int allocation[][]=new int[5][3]; //分配
static int need[][]=new int[5][3]; //需求
static int request[]=new int[3]; //存放请求
Scanner scanner=new Scanner(System.in);
int thread; //线程号 //初始化
public void getData(){
System.out.println("请输入A,B,C三类资源的数目:");
//输入A,B,C三类资源数量
for(int i=0;i<3;i++){
available[i]=scanner.nextInt();
}
//输入进程对三类资源的最大需求
for(int i=0;i<5;i++){
System.out.println("请输入进程"+i+"对A,B,C三类资源的最大需求");
for(int j=0;j<3;j++){
max[i][j]=scanner.nextInt();
}
}
//输入进程分配的三类资源数
for(int i=0;i<5;i++){
System.out.println("请输入进程"+i+"已分配的A,B,C三类资源数");
for(int j=0;j<3;j++){
allocation[i][j]=scanner.nextInt();
}
}
//计算进程还需要的三类资源数
for(int i=0;i<5;i++){
for(int j=0;j<3;j++){
need[i][j]=max[i][j]-allocation[i][j];
}
}
//重新计算available
for(int i=0;i<3;i++){
for(int j=0;j<5;j++){
available[i]-=allocation[j][i];
}
}
}
//用户输入要申请资源的线程和申请的资源,并进行判断
public void getThread(){
System.out.println("请输入申请资源的线程");
int thread=scanner.nextInt(); //线程
if(thread<0||thread>4){
System.out.println("该线程不存在,请重新输入");
getThread();
}else{
this.thread=thread;
System.out.println("请输入申请的资源(三种,若某种资源不申请则填0)");
for(int i=0;i<3;i++){
request[i]=scanner.nextInt();
}
if(request[0]>need[thread][0]||request[1]>need[thread][1]||request[2]>need[thread][2]){
System.out.println(thread+"线程申请的资源超出其需要的资源,请重新输入");
getThread();
}else{
if(request[0]> available[0]||request[1]> available[1]||request[2]> available[2]){
System.out.println(thread+"线程申请的资源大于系统资源,请重新输入");
getThread();
}
}
changeData(thread);
if(check(thread)){
getThread();
}else{
recoverData(thread);
getThread();
} }
} //thread线程请求响应后,试探性分配资源
public void changeData(int thread){
for(int i=0;i<3;i++){
//重新调整系统资源数
available[i]-=request[i];
//计算各个线程拥有资源
allocation[thread][i]+=request[i];
//重新计算需求
need[thread][i]-=request[i];
}
} //安全性检查为通过,分配失败时调用,恢复系统原状
public void recoverData(int thread){
for(int i=0;i<3;i++){
//重新调整系统资源数
available[i]+=request[i];
//计算各个线程拥有资源
allocation[thread][i]-=request[i];
//重新计算需求
need[thread][i]+=request[i];
}
} //对线程thread安全性检查
public boolean check(int thread){
boolean finish[]=new boolean[5];
int work[]=new int[3];
int queue[]=new int[5]; //由于存放安全队列
int k=0;//安全队列下标
int j; //要判断的线程
int i;
//是否分配的标志
for(i=0;i<5;i++)
finish[i]=false;
j=thread;
for(i=0;i<3;i++){
work[i]=available[i];
}
while(j<5){
for( i=0;i<3;i++){
if(finish[j]){
j++;
break;
}else if(need[j][i]>work[i]){
System.out.println(need[j][i]+"*"+i+work[i]);
j++;
break;
}else if(i==2){
for(int m=0;m<3;m++){
work[m]+=allocation[j][m];
}
finish[j]=true;
queue[k]=j;
k++;
j=0; //从最小线程再开始判断
}
}
} //判断是否都属于安全状态
for(int p=0;p<5;p++){
if(finish[p]=false){
System.out.println("系统不安全,资源申请失败");
return false;
}
}
System.out.println("资源申请成功,安全队列为:");
for(int q=0;q<5;q++){
System.out.println(queue[q]);
}
return true;
}
//打印need和available,需要时调用
public void showData(){
System.out.println("need");
for(int i=0;i<5;i++){
for(int j=0;j<3;j++){
System.out.print(need[i][j]+" ");
}
}
System.out.println("available");
for(int j=0;j<3;j++){
System.out.print(available[j]+" ");
}
}
public static void main(String[] args) {
Banker bk=new Banker();
bk.getData();
bk.getThread(); } }

银行家算法java实现的更多相关文章

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

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

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

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

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

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

  4. 归并排序算法 java 实现

    归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...

  5. 快速排序算法 java 实现

    快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...

  6. 堆排序算法 java 实现

    堆排序算法 java 实现 白话经典算法系列之七 堆与堆排序 Java排序算法(三):堆排序 算法概念 堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特 ...

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

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

  8. Atitit 电子商务订单号码算法(java c# php js 微信

    Atitit 电子商务订单号码算法(java c# php js  微信 1.1. Js版本的居然钱三爷里面没有..只好自己实现了. 1.2. 订单号标准化...长度16位 1.3. 订单号的结构 前 ...

  9. 无向图的最短路径算法JAVA实现

    一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图. ...

随机推荐

  1. Eclipse插件引入jar包的方法(转)

    搞了两天,终于找到解决办法了.原来  Eclipse 插件项目引入外面的jar包不能用   build path---->add external jars的方法. 先说明两个概念:类加载器,O ...

  2. ORACLE 中的一些特殊符号

    oracle通配符,运算符的使用 用于where比较条件的有: 等于:=.<.<=.>.>=.<> 包含:in.not in exists.not exists 范 ...

  3. [Android]图片资源管理学习

    一.概念 几个概念:1.像素:像素是组成图像的最基本单位:点该点自身有大小,其中保存了颜色值 2.屏幕尺寸:screen size手机屏幕的物理尺寸.单位:inch(英寸)ex:4.0英寸 3.8英寸 ...

  4. HashMap的工作原理(转)

    HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此 ...

  5. VC++ 视频播放器 图文步骤记录

    1.安装DirectShow9.0 SDK DirectShow9 SDK下载链接http://download.csdn.net/detail/jindou910101/5591169 2.运行Di ...

  6. VMware vSphere服务器虚拟化实验十五 vCenter vShield Manager

    VMware vSphere服务器虚拟化实验十五 vCenter vShield Manager VMware  vShield Manager是专为 VMware vCenter Server 集成 ...

  7. 关于索引删除的策略IndexDeletionPolicy

    关于索引删除的策略IndexDeletionPolicy . public IndexWriter(Directory d, Analyzer a, boolean create)          ...

  8. POJ-1324-Holedox Moving(BFS)

    Description During winter, the most hungry and severe time, Holedox sleeps in its lair. When spring ...

  9. windows 2003 自动安全设置

    @echo offecho.echo.echo.echo 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓echo.echo.echo windows 2003 自动安全设置程序 echo. ec ...

  10. Hadoop Spark 集群简便安装总结

    本人实际安装经验,目的是为以后高速安装.仅供自己參考. 一.Hadoop 1.操作系统一如既往:①setup关掉防火墙.②vi /etc/sysconfig/selinux,改SELINUX=disa ...