银行家算法_java
来源:互联网 发布:双汇系统网址知多少 编辑:程序博客网 时间:2024/06/05 19:21
package BankerDijkstra;
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]; } }
}
- 银行家算法_java
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- TJU训练赛—E
- java基础教程:常用对象之StringBuilder StringBuffer(22)
- 过滤器Filter的详解
- 做大数据论文时的分析思路
- debian修复grub
- 银行家算法_java
- JAVA 下的 pgp加密解密示例
- javascript
- Echarts 标签过长如何让axisLabel换行
- IsNullOrEmpty()方法
- Python一些小知识
- Swift 4 JSON 解析指南
- Leetcode Word Break II
- 虚拟机中vsftpd上传速度慢的解决办法