java版本银行家算法
2016-05-19 09:56
369 查看
import java.util.Scanner; public class yinhangjia { int available[] = new int[]{3,3,2}; int max[][] = new int[][]{{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; int allocation[][] = new int[][]{{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; int need[][] = new int[][]{{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}}; void showData() { System.out.println("进程号 Max Allocation Need "); System.out.println(" A B C A B C A B C"); for(int i = 0;i<5;i++) { System.out.print(i+" "); for(int m = 0;m<3;m++) System.out.print(max[i][m]+" "); for(int m = 0;m<3;m++) System.out.print(allocation[i][m]+" "); for(int m = 0;m<3;m++) System.out.print(need[i][m]+" "); System.out.println(); } } boolean change(int inRequestNum,int inRequest[]) { int requestNum = inRequestNum; int request[] = inRequest; if(!(request[0]<=need[requestNum][0]&&request[1]<=need[requestNum][1]&&request[2]<=need[requestNum][2])) { System.out.println("请求的资源数超过了所需要的最大值"); return false; } if((request[0]<=available[0]&&request[1]<=available[1]&&request[2]<=available[2])==false) { System.out.println("尚无足够资源分配"); return false; } for(int i = 0;i<3;i++) { available[i] = available[i]-request[i]; allocation[requestNum][i] = allocation[requestNum][i] + request[i]; need[requestNum][i] = need[requestNum][i] - request[i]; } boolean flag = checkSafe(available[0],available[1],available[2]);//进行安全性检查并返回是否安全 if(flag==true) { System.out.println("能够安全分配"); return true; } else { System.out.println("不能够安全分配"); for(int i = 0;i<3;i++) { available[i] = available[i]+request[i]; allocation[requestNum][i] = allocation[requestNum][i] - request[i]; need[requestNum][i] = need[requestNum][i] + request[i]; } return false; } } boolean checkSafe(int a,int b,int c)//安全性检查 { int work[] = new int[3]; work[0] = a; work[1] = b; work[2] = c; int i=0; boolean finish[] = new boolean[5]; /*while(i<5) { if(finish[i]==false&&need[i][0]<=work[0]&&need[i][1]<=work[1]&&need[i][2]<=work[2]) { System.out.println("分配成功的是"+i); for(int m = 0;m<3;m++) work[m] =work[m] + allocation[i][m]; finish[i] = true; i=0; } else i++; }*/ boolean x=true; int n=0; int nn=0; while(x){ for(int j=0;j<5;j++){ if(finish[j]==false&&need[j][0]<=work[0]&&need[j][1]<=work[1]&&need[j][2]<=work[2]) { System.out.println("分配成功的是"+j); for(int m = 0;m<3;m++) work[m] =work[m] + allocation[j][m]; finish[j] = true; n++; } } if(n==nn){ break; } nn=n; } for(i=0;i<5;i++) { if(finish[i]==false) return false; } return true; } public static void main(String[] args) { yinhangjia bank = new yinhangjia(); bank.showData(); int request[] =new int[3]; int requestNum; String source[] = new String[]{"A","B","C"}; Scanner s = new Scanner(System.in); String choice = new String(); while(true)//循环进行分配 { System.out.println("请输入要请求的进程号(0--4):"); requestNum = s.nextInt(); System.out.print("请输入请求的资源数目"); for(int i = 0;i<3;i++) { System.out.println(source[i]+"资源的数目:"); request[i] = s.nextInt(); } bank.change(requestNum, request); //bank.showData(); System.out.println("是否再请求分配(y/n)"); choice = s.next(); if(choice.equals("n")) break; } } }
相关文章推荐
- 把myeclipse生成的javadoc
- java comet 长轮询的案例
- 什么是Java实例初始化块
- 实例解析观察者模式及其在Java设计模式开发中的运用
- java Pattern和Matcher详解(正则表达式)
- java执行cmd命令堵塞的另外一种处理方式
- Struts2中使用通配符
- Java的接口和抽象类详解
- java 并发多线程的声明
- java equals 使用
- java执行cmd命令出现堵塞现象的解决方法
- Json串与实体的相互转换 (不依赖于jar包 只需Eclipse环境即可)
- 深入理解Java类加载器(2):线程上下文类加载器
- 深入理解Java类加载器(1):Java类加载原理解析
- java类加载的过程
- Java学习之——线程非安全单利模式到线程安全单利模式
- JavaMail发送邮件
- JDK 卸载
- JDK 卸载
- eclipse 4.4 隐藏/显示jar包