java实现银行家算法
本文实例为大家分享了java实现银行家算法的具体代码,供大家参考,具体内容如下
importjava.util.Arrays; importjavax.swing.JOptionPane; publicclassBanker_Dijkstra{ staticintavailable[]={3,3,2};//可利用资源数 staticintmax[][]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};;//每线程最大需求 staticintallocation[][]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//已分配资源 staticintneed[][]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};//需求 staticintrequest[]=newint[3];//存放请求资源 staticintthread;//线程号 staticJOptionPanejpane=newJOptionPane(); //staticbooleanm; publicstaticvoidmain(String[]argv){ intn=0; Banker_Dijkstrabd=newBanker_Dijkstra(); for(inti=0;i<5;i++){ if(bd.safeState(i)){ JOptionPane.showMessageDialog(jpane,"系统状态安全"); n=1; break; }else{ n=2; continue; } } if(n==1){ bd.getThread(); } elseif(n==2){ JOptionPane.showMessageDialog(jpane,"系统状态不安全"); } } protectedvoidgetThread(){//输入测试线程号且输出结果 try{ Stringxiancheng=JOptionPane.showInputDialog(jpane,"请输入申请资源的线程:"); thread=(int)Integer.parseInt(xiancheng); }catch(Exceptione){ intresponse=JOptionPane.showConfirmDialog(jpane,"请输入0~4:",null,JOptionPane.YES_NO_OPTION); //处理异常 if(response==0){ getThread(); }elseif(response==1){ System.exit(0); } } if(thread<0||thread>4){ JOptionPane.showMessageDialog(jpane,"请输入0~4:"); getThread(); }else{ for(inti=0;i<3;i++){ StringrequestR=JOptionPane.showInputDialog(jpane,"请输入申请的第"+(i+1)+"种资源(若不申请则填0)"); try{ request[i]=Integer.parseInt(requestR);} catch(Exceptione){ 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); //判断继续模拟选择与处理 inttag=0; if(check(thread)){ try{ Stringstr=JOptionPane.showInputDialog(jpane,"是/否继续模拟?(1/0):"); tag=Integer.parseInt(str); }catch(Exceptione){ 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(); } } } //安全算法 privatebooleancheck(intthread2){ boolean[]finish=newboolean[5]; Arrays.fill(finish,false); int[]work=newint[3]; int[]queue=newint[5]; intq=0;//安全序列下标 for(inti=0;i<3;i++){ work[i]=available[i]; } inttT=thread2; while(tT<5){ for(intR=0;R<3;R++){ if((!(finish[tT]==false))||(!(work[R]>=need[tT][R]))){ tT++; break; }else{ if(R==2){ for(intm=0;m<3;m++){ work[m]+=allocation[tT][m]; } for(ints:work){ System.out.print(s+""); } System.out.println(""); finish[tT]=true; queue[q]=tT; q++; tT=0; } } } } for(intp=0;p<5;p++){ if(finish[p]==false){ JOptionPane.showMessageDialog(jpane,"安全序列生成失败"); returnfalse; } } JOptionPane.showMessageDialog(jpane,"安全序列:"+queue[0]+","+queue[1]+"," +queue[2]+","+queue[3]+","+queue[4]); returntrue; } privatebooleansafeState(intthread3){ boolean[]finish=newboolean[5]; Arrays.fill(finish,false); int[]work=newint[3]; int[]queue=newint[5]; intq=0;//安全序列下标 for(inti=0;i<3;i++){ work[i]=available[i]; } inttT=thread3; while(tT<5){ for(intR=0;R<3;R++){ if((!(finish[tT]==false))||(!(work[R]>=need[tT][R]))){ tT++; break; } else{ if(R==2){ for(intm=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(intm=0;m<3;m++){ //work[m]+=allocation[tT][m];} //finish[tT]=true; //queue[q]=tT; //q++; //tT=0; //}else{ //tT++; //break; //} } } for(intp=0;p<5;p++){ if(finish[p]==false){ returnfalse; } } returntrue; } privatevoidrecoverData(intthread2){//生成失败则重置已分配资源 for(inti=0;i<3;i++){ //重新调整系统资源数 available[i]+=request[i]; //计算各个线程拥有资源 allocation[thread2][i]-=request[i]; //重新计算需求 need[thread2][i]+=request[i]; } } privatevoidallocateData(intthread2){//分配 for(inti=0;i<3;i++){ //重新调整可用系统资源数 available[i]-=request[i]; //计算各个线程分配后拥有资源 allocation[thread2][i]+=request[i]; //重新计算需求 need[thread2][i]-=request[i]; } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。