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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。