銀行家演算法java實現
阿新 • • 發佈:2019-02-11
關於銀行家演算法的理論知識,課本或者百度上有好多資料,我就不再多說了,這裡把我最近寫的銀行家演算法的實現帶碼貼出來。
由於這是我們的一個實驗,對系統資源數和程序數都指定了,所以這裡也將其指定了,其中系統資源數為3,程序數為5.
import java.util.Scanner; import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction; import javax.swing.text.StyledEditorKit.ForegroundAction; public class Banker { static int available[]=new int[3]; //資源數 static int max[][]=new int[5][3]; //最大需求 static int allocation[][]=new int[5][3]; //分配 static int need[][]=new int[5][3]; //需求 static int request[]=new int[3]; //存放請求 Scanner scanner=new Scanner(System.in); int thread; //執行緒號 //初始化 public void getData(){ System.out.println("請輸入A,B,C三類資源的數目:"); //輸入A,B,C三類資源數量 for(int i=0;i<3;i++){ available[i]=scanner.nextInt(); } //輸入程序對三類資源的最大需求 for(int i=0;i<5;i++){ System.out.println("請輸入程序"+i+"對A,B,C三類資源的最大需求"); for(int j=0;j<3;j++){ max[i][j]=scanner.nextInt(); } } //輸入程序分配的三類資源數 for(int i=0;i<5;i++){ System.out.println("請輸入程序"+i+"已分配的A,B,C三類資源數"); for(int j=0;j<3;j++){ allocation[i][j]=scanner.nextInt(); } } //計算程序還需要的三類資源數 for(int i=0;i<5;i++){ for(int j=0;j<3;j++){ need[i][j]=max[i][j]-allocation[i][j]; } } //重新計算available for(int i=0;i<3;i++){ for(int j=0;j<5;j++){ available[i]-=allocation[j][i]; } } } //使用者輸入要申請資源的執行緒和申請的資源,並進行判斷 public void getThread(){ System.out.println("請輸入申請資源的執行緒"); int thread=scanner.nextInt(); //執行緒 if(thread<0||thread>4){ System.out.println("該執行緒不存在,請重新輸入"); getThread(); }else{ this.thread=thread; System.out.println("請輸入申請的資源(三種,若某種資源不申請則填0)"); for(int i=0;i<3;i++){ request[i]=scanner.nextInt(); } if(request[0]>need[thread][0]||request[1]>need[thread][1]||request[2]>need[thread][2]){ System.out.println(thread+"執行緒申請的資源超出其需要的資源,請重新輸入"); getThread(); }else{ if(request[0]> available[0]||request[1]> available[1]||request[2]> available[2]){ System.out.println(thread+"執行緒申請的資源大於系統資源,請重新輸入"); getThread(); } } changeData(thread); if(check(thread)){ getThread(); }else{ recoverData(thread); getThread(); } } } //thread執行緒請求響應後,試探性分配資源 public void changeData(int thread){ for(int i=0;i<3;i++){ //重新調整系統資源數 available[i]-=request[i]; //計算各個執行緒擁有資源 allocation[thread][i]+=request[i]; //重新計算需求 need[thread][i]-=request[i]; } } //安全性檢查為通過,分配失敗時呼叫,恢復系統原狀 public void recoverData(int thread){ for(int i=0;i<3;i++){ //重新調整系統資源數 available[i]+=request[i]; //計算各個執行緒擁有資源 allocation[thread][i]-=request[i]; //重新計算需求 need[thread][i]+=request[i]; } } //對執行緒thread安全性檢查 public boolean check(int thread){ boolean finish[]=new boolean[5]; int work[]=new int[3]; int queue[]=new int[5]; //由於存放安全佇列 int k=0;//安全佇列下標 int j; //要判斷的執行緒 int i; //是否分配的標誌 for(i=0;i<5;i++) finish[i]=false; j=thread; for(i=0;i<3;i++){ work[i]=available[i]; } while(j<5){ for( i=0;i<3;i++){ if(finish[j]){ j++; break; }else if(need[j][i]>work[i]){ //System.out.println(need[j][i]+"*"+i+work[i]); j++; break; }else if(i==2){ for(int m=0;m<3;m++){ work[m]+=allocation[j][m]; } finish[j]=true; queue[k]=j; k++; j=0; //從最小執行緒再開始判斷 } } } //判斷是否都屬於安全狀態 for(int p=0;p<5;p++){ if(finish[p]=false){ System.out.println("系統不安全,資源申請失敗"); return false; } } System.out.println("資源申請成功,安全佇列為:"); for(int q=0;q<5;q++){ System.out.println(queue[q]); } return true; } //列印need和available,需要時呼叫 public void showData(){ System.out.println("need"); for(int i=0;i<5;i++){ for(int j=0;j<3;j++){ System.out.print(need[i][j]+" "); } } System.out.println("available"); for(int j=0;j<3;j++){ System.out.print(available[j]+" "); } } public static void main(String[] args) { Banker bk=new Banker(); bk.getData(); bk.getThread(); } }