java怎么实现银行家算法
创始人
2024-12-24 18:01:35
0次

本文实例为大家分享了java实现银行家算法的具体代码,供大家参考,具体内容如下

import java.util.Arrays;import javax.swing.JOptionPane;public class Banker_Dijkstra { static int available[]={3,3,2};   //可利用资源数  static int max[][]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};;   //每线程最大需求  static int allocation[][]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; //已分配资源  static int need[][]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};  //需求  static int request[]=new int[3];   //存放请求资源  static int thread; //线程号  static JOptionPane jpane = new JOptionPane(); // static boolean m; public static void main(String[] argv){   int n = 0 ;  Banker_Dijkstra bd = new Banker_Dijkstra();  for(int i=0;i<5;i++){   if(bd.safeState(i)){    JOptionPane.showMessageDialog(jpane, "系统状态安全");    n=1;    break;   }else{    n=2;    continue;      }  }    if(n==1){   bd.getThread();   }  else if(n==2){   JOptionPane.showMessageDialog(jpane, "系统状态不安全");  } } protected void getThread(){//输入测试线程号且输出结果  try{  String xiancheng = JOptionPane.showInputDialog(jpane,"请输入申请资源的线程:");  thread = (int) Integer.parseInt(xiancheng);  }catch(Exception e){   int response = JOptionPane.showConfirmDialog(jpane, "请输入0~4:",null, JOptionPane.YES_NO_OPTION);    // 处理异常   if(response==0){    getThread();   }else if(response ==1){    System.exit(0);   }  }  if(thread<0||thread>4){    JOptionPane.showMessageDialog(jpane, "请输入0~4:");    getThread();   }else{    for(int i=0;i<3;i++){     String requestR = JOptionPane.showInputDialog(jpane,"请输入申请的第"+(i+1)+"种资源(若不申请则填0)");    try{    request[i]=Integer.parseInt(requestR);}    catch(Exception e){     JOptionPane.showConfirmDialog(jpane, "请输入申请的第"+(i+1)+"种资源(若不申请则填0)",null,JOptionPane.YES_NO_OPTION);    }   }    if(request[0]>need[thread][0]||request[1]>need[thread][1]||request[2]>need[thread][2]){     JOptionPane.showMessageDialog(jpane,thread+"线程申请的资源超出其需要的资源,请重新输入");     getThread();    }else{     if(request[0]> available[0]||request[1]> available[1]||request[2]> available[2]){     JOptionPane.showMessageDialog(jpane,thread+"线程申请的资源大于系统资源,请重新输入");      getThread();     }    }    // 分配资源   allocateData(thread);    // 判断 继续模拟选择与处理   int tag=0;   if(check(thread)){     try{     String str = JOptionPane.showInputDialog(jpane,"是/否 继续模拟?( 1/0 ):");     tag = Integer.parseInt(str);     }catch(Exception e){      JOptionPane.showMessageDialog(jpane, "继续 输入(数值) 1,不继续 输入(数值) 0 !");     }     if(tag==1){       recoverData(thread);       getThread();      }     else{     if( (JOptionPane.YES_NO_OPTION)==JOptionPane.CANCEL_OPTION)System.exit(0);     if((JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION) recoverData(thread);     }   }else{     recoverData(thread);     getThread();     }   } } // 安全算法 private boolean check(int thread2) {  boolean[] finish = new boolean[5];   Arrays.fill(finish, false);  int[] work = new int[3];  int[] queue = new int[5];  int q=0;//安全序列下标  for(int i = 0;i<3;i++){   work[i] = available[i];  }  int tT = thread2;  while(tT<5){   for(int R=0;R<3;R++){    if((!(finish[tT]==false))||(!(work[R]>=need[tT][R]))){     tT++;     break;    }else{     if(R==2){      for(int m =0;m<3;m++){       work[m] += allocation[tT][m];      }      for(int s:work){       System.out.print(s+" ");      }      System.out.println("");      finish[tT] = true;      queue[q] = tT;      q++;      tT =0;     }    }   }   }  for(int p =0;p<5;p++){   if(finish[p]==false){    JOptionPane.showMessageDialog(jpane, "安全序列生成失败");    return false;    }  }   JOptionPane.showMessageDialog(jpane, "安全序列:"+queue[0]+","+queue[1]+","  +queue[2]+","+queue[3]+","+queue[4]);   return true; } private boolean safeState(int thread3){  boolean[] finish = new boolean[5];   Arrays.fill(finish, false);   int[] work = new int[3];   int[] queue = new int[5];   int q=0;//安全序列下标   for(int i = 0;i<3;i++){    work[i] = available[i];   }   int tT = thread3;   while(tT<5){    for(int R=0;R<3;R++){     if((!(finish[tT]==false))||(!(work[R]>=need[tT][R]))){      tT++;      break;     }     else{      if(R==2){       for(int m =0;m<3;m++){        work[m] += allocation[tT][m];       }       finish[tT] = true;       queue[q] = tT;       q++;       tT =0;      }     }//     if((finish[tT]==false)&&(work[R]>=need[tT][R])){//      for(int m =0;m<3;m++){//       work[m] += allocation[tT][m];}//      finish[tT] = true;//      queue[q] = tT;//      q++;//      tT=0;//      }else{ //       tT++;//       break;//       }    }    }   for(int p =0;p<5;p++){    if(finish[p]==false){     return false;     }   }    return true; } private void recoverData(int thread2) { // 生成失败则重置已分配资源  for(int i=0;i<3;i++){    //重新调整系统资源数    available[i]+=request[i];    //计算各个线程拥有资源    allocation[thread2][i]-=request[i];    //重新计算需求    need[thread2][i]+=request[i];   }  } private void allocateData(int thread2) { //分配  for(int i=0;i<3;i++){    //重新调整可用系统资源数    available[i]-=request[i];    //计算各个线程分配后拥有资源    allocation[thread2][i]+=request[i];    //重新计算需求    need[thread2][i]-=request[i];   }   }}

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...