银行家算法java实现
关于银行家算法的理论知识,课本或者百度上有好多资料,我就不再多说了,这里把我最近写的银行家算法的实现带码贴出来。
由于这是我们的一个实验,对系统资源数和进程数都指定了,所以这里也将其指定了,其中系统资源数为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实现的更多相关文章
- 预防和避免死锁的方法及银行家算法的java简单实现
预防死锁 (1) 摒弃"请求和保持"条件 基本思想:规定所有进程在开始运行之前,要么获得所需的所有资源,要么一个都不分配给它,直到所需资源全部满足才一次性分配给它. 优点:简单.易 ...
- java面试题之死锁产生的条件,以及如何避免死锁,银行家算法,产生死锁后如何解决(阿里面试题)
死锁产生的四个必要条件: 互斥:一个资源每次只能被一个进程使用(资源独立) 请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放(不释放锁) 不剥夺:进程已获得的资源,在未使用之前,不能强行 ...
- c/c++多线程模拟系统资源分配(并通过银行家算法避免死锁产生)
银行家算法数据结构 (1)可利用资源向量Available 是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目.如果Available[j]=K,则表示系统中现有Rj类资源K个. (2) ...
- 归并排序算法 java 实现
归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...
- 快速排序算法 java 实现
快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...
- 堆排序算法 java 实现
堆排序算法 java 实现 白话经典算法系列之七 堆与堆排序 Java排序算法(三):堆排序 算法概念 堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特 ...
- Round() 四舍五入 js银行家算法(转)
首先问一下round(0.825,2) 返回的结果,大家猜一猜, 首先SQL server 返回的是 0.83 js的返回结果 是0.83,code 如下: var b = 0.825; ...
- Atitit 电子商务订单号码算法(java c# php js 微信
Atitit 电子商务订单号码算法(java c# php js 微信 1.1. Js版本的居然钱三爷里面没有..只好自己实现了. 1.2. 订单号标准化...长度16位 1.3. 订单号的结构 前 ...
- 无向图的最短路径算法JAVA实现
一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图. ...
随机推荐
- C++内存管理学习笔记(6)
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
- java学习笔记10--枚举
java学习笔记10--枚举 在JDK1.5之前,java可以有两种方式定义新类型:类和接口.对于大部分面向对 象编程来说,这两种方法看起来似乎足够了,但是在一些特殊情况下,这些方法就不适合.例如,想 ...
- MySQL聚合函数、控制流程函数(含navicat软件的介绍)
MySQL聚合函数.控制流程函数(含navicat软件的介绍) 一.navicat的引入:(第三方可视化的客户端,方便MySQL数据库的管理和维护) NavicatTM是一套快速.可靠并价格相宜的数据 ...
- VSTO学习笔记(四)从SharePoint 2010中下载文件
原文:VSTO学习笔记(四)从SharePoint 2010中下载文件 上一次我们开发了一个简单的64位COM加载项,虽然功能很简单,但是包括了开发一个64位COM加载项的大部分过程.本次我们来给CO ...
- Terracotta收购Ehcache (转)
随着Terracotta对Ehcache的收购成行,业界两大知名的开源Java缓存产品走到了一起.以提供JVM级“POJO集群”而闻名于世的Terracotta可以将运行在单个JVM上的多线程应用移植 ...
- .Net程序猿乐Android开发---(4)注册页面布局
接下来我们介绍的登陆页面布局,在本节中,我们看一下注册页面布局,页面布局大同小异,来一起熟悉下基本控件的使用方法. 效果图: 1.加入注冊页面 右键选中layout目录,加入注冊页面.例如以下图 点击 ...
- zzu--2014年11月16日月潭赛 B称号
1229: Rational Resistance Time Limit: 1 Sec Memory Limit: 128 MB Submit: 8 Solved: 4 [id=1229" ...
- JavaScript中的对象(一)
Email:longsu2010 at yeah dot net 最近我和朋友谈起JavaScript中对象的问题.朋友以写JavaScript为生,而且生活的很好,然而我发现他并不真正懂这们语言的某 ...
- Java调用IIS发布的WebService
之前的一篇博客说了一个实例,就是用VS2005在IIS上发布WebService.今天我们来实现在Eclipse上用Java来调用昨天发布的WebService. 首先咋在浏览器中输入http://1 ...
- 《火球——UML大战需求分析》(第1章 大话UML)——1.3 行为型的UML(Behavior Diagram)
说明: <火球——UML大战需求分析>是我撰写的一本关于需求分析及UML方面的书,我将会在CSDN上为大家分享前面几章的内容,总字数在几万以上,图片有数十张.欢迎你按文章的序号顺序阅读,谢 ...