当前位置:文档之家› 银行家算法的java编程实现

银行家算法的java编程实现

/*死锁避免和死锁检测模拟程序【银行家算法】网络工程06-3班学号:310609040308*/import java.util.*;public class TestTheBanker {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);TheBanker tb = new TheBanker();tb.deadlockAvoidance();//死锁避免int gate = 1;while(gate!=0){tb.deadlockDetection();//死锁检测System.out.println("如果您要继续分配资源请输入\"1\",退出请输入\"0\"");System.out.print("您输入的值为:");gate = scanner.nextInt();System.out.println();}System.out.println("使用愉快!期待您下次使用!");}}class TheBanker{int m;int n;int[][] max;int[][] maxbak;//备份用int[][] allocation;int[][] allocationbak;//备份用int[][] need;int[][] needbak;//备份用int[] available;int[] availablebak;//备份用public TheBanker(){Scanner s = new Scanner(System.in);System.out.println("初始化==============");System.out.print("请依次输入系统中的【进程数】和【资源类型数】:");m = s.nextInt();n = s.nextInt();max =new int[m][n];maxbak = new int[m][n];allocation = new int[m][n];allocationbak = new int[m][n];need = new int[m][n];needbak = new int[m][n];available = new int[n];availablebak = new int[n];for(int i=0;i<max.length;i++){//初始化向量MAX、ALLOCATION、NEED、AVAILABLESystem.out.print("请依次输入第" + i + "进程的各资源数:");for(int j=0;j<max[i].length;j++){max[i][j] = s.nextInt();maxbak[i][j] = max[i][j];}}for(int i=0;i<allocation.length;i++){System.out.print("请依次输入第" + i + "进程中已分配资源的数量:");for(int j=0;j<allocation[i].length;j++){allocation[i][j] = s.nextInt();allocationbak[i][j] = allocation[i][j];}}for(int i=0;i<need.length;i++){for(int j=0;j<need[i].length;j++){need[i][j] = max[i][j] - allocation[i][j];needbak[i][j] = need[i][j];}}for(int i=0;i<available.length;i++){System.out.print("请输入系统中第" + i + "种资源的剩余量:");available[i] = s.nextInt();availablebak[i] = available[i];}System.out.println("初始化结果=============");System.out.println(" MAXALLOCATION NEED AVAILABLE");for(int i=0;i<m;i++){System.out.print("P" + i + ": ");for(int j=0;j<n;j++){if(max[i][j]>9){//如果是两位数,控制格式,在数字前少输出一个" "。

System.out.print(max[i][j] + " ");}else{System.out.print(" " + max[i][j] + " ");}}System.out.print(" ");for(int j=0;j<n;j++){if(allocation[i][j]>9){System.out.print(allocation[i][j] + " ");}else{System.out.print(" " + allocation[i][j] + " ");}}System.out.print(" ");for(int j=0;j<n;j++){if(need[i][j]>9){System.out.print(need[i][j] + " ");}else{System.out.print(" " + need[i][j] + " ");}}if(i==0){System.out.print(" ");for(int j=0;j<n;j++){if(available[j]>9){System.out.print(available[j] + " ");}else{System.out.print(" " + available[j] + " ");}}}System.out.println();}System.out.println("=====完成初始化=====");System.out.println();}public void deadlockAvoidance(){int[] security = new int[m];boolean[] param = new boolean[m];int[] tar = new int[n];int count = 0;int num1 = m+1;//计数器,每循环一遍所有进程就自减1int num2 = m;//计数器,每遇到一个被满足的进程就自减1while(num1>0){//如果num1==0,则说明依次循环下来没有能够满足的进程,因此中止for(int i=0;i<m;i++){if(param[i]==false){//只有没有被满足的进程才可以进入内层循环param[i] = true;for(int j=0;j<n;j++){tar[j] = available[j] - need[i][j];if(tar[j]<0){param[i] = false;}}if(param[i]==true){for(int k=0;k<n;k++){available[k] = available[k] + allocation[i][k];}security[count] = i;//记录以满足的进程号count++;num2--;}}}num1--;while((num2==0)&&(num1>0)){System.out.print("【安全序列】为:");for(int i=0;i<m;i++){if(i==(m-1)){System.out.print("P" + security[i]);}else{System.out.print("P" + security[i] + "-->");}}System.out.println();System.out.println("=====【死锁避免】结束=====");System.out.println();return;}while((num1==0)&&(num2>0)){System.out.println("抱歉!没有【安全序列】!");System.out.println("=====【死锁避免】结束=====");System.out.println();}}}public void deadlockDetection(){Scanner sc = new Scanner(System.in);int key;int[] security = new int[m];boolean[] param = new boolean[m];int[] temp = new int[n];int[] tar = new int[n];int count = 0;int num1 = m+1;//计数器,每循环一遍所有进程就自减1int num2 = m;//计数器,每遇到一个被满足的进程就自减1for(int i=0;i<m;i++){//回复死锁检测前的状态for(int j=0;j<n;j++){max[i][j] = maxbak[i][j];allocation[i][j] = allocationbak[i][j];need[i][j] = needbak[i][j];available[j] = availablebak[j];}}System.out.println();System.out.println("死锁检测============");System.out.println("如果您此时想申请系统资源请输入【进程号】和"+n+"种【资源量】,系统将帮您判断是否可行。

相关主题