存在安全序列显示序列内容
若不存在,则不显示
import java.util.LinkedList; import java.util.Scanner; import java.util.Queue; public class Banker2 { int Available[]=new int[3]; int Allocation[][]=new int[5][3]; int Claim[][]=new int[5][3]; int Need[][]=new int[5][3]; int Work[]=new int[3]; Queue<Integer> queue=new LinkedList<>(); int count=0; int find=0; int flag=1; public void Input() { Scanner sc=new Scanner(System.in); System.out.println("请分别输入系统中A,B,C三类资源Available的个数:"); for(int i=0;i<3;i++) { Available[i]=sc.nextInt(); } System.out.println("请分别输入每个进程的Allocation资源:"); for(int j=0;j<5;j++) { System.out.println("输入P"+j+"的Allocation的A B C资源:"); for(int k=0;k<3;k++) { Allocation[j][k]=sc.nextInt(); } System.out.println("P"+j+"进程输入完毕。"); } System.out.println("请分别输入每个进程的Claim资源:"); for(int j=0;j<5;j++) { System.out.println("输入P"+j+"的Claim的A B C资源:"); for(int k=0;k<3;k++) { Claim[j][k]=sc.nextInt(); } System.out.println("P"+j+"进程输入完毕。"); } System.out.println("系统的Available资源为:"); System.out.println("A B C"); for(int num:Available) { System.out.print(num+" "); } System.out.println("每个进程的Claim资源如下:"); System.out.println(" A B C"); for(int i=0;i<5;i++) { System.out.print("P" + i + ":" ); for (int j = 0; j < 3; j++) { System.out.print(Claim[i][j] + " "); } System.out.println(); } System.out.println(); System.out.println("每个进程的Allocation资源如下:"); System.out.println(" A B C"); for(int i=0;i<5;i++) { System.out.print("P" + i + ":" ); for (int j = 0; j < 3; j++) { System.out.print(Allocation[i][j] + " "); } System.out.println(); } for(int i=0;i<5;i++) { for(int j=0;j<3;j++) { Need[i][j]=Claim[i][j]-Allocation[i][j]; } } System.out.println("每个进程的Need资源如下:"); System.out.println(" A B C"); for(int i=0;i<5;i++) { System.out.print("P" + i + ":" ); for (int j = 0; j < 3; j++) { System.out.print(Need[i][j] + " "); } System.out.println(); } } public void Calculate() { for(int i=0;i<3;i++) { Work[i]=Available[i]; } while (queue.size() < 5 && count < 5) { for (int i = 0; i < 5; i++) { if (Need[i][0] <= Work[0] && Need[i][1] <= Work[1] && Need[i][2] <= Work[2]) { if (!queue.contains(i)) { queue.add(i); count++; for (int k = 0; k < 3; k++) { Work[k] += Allocation[i][k]; flag = 1; } } } else { find++; continue; } if(find>15) { flag=0; } } } } public void Output() { if(flag==0) { System.out.println("系统处于不安全状态!"); } else { System.out.println("安全序列为:"); for (Integer num : queue) { System.out.println(num); } } } public static void main(String args[]) throws InterruptedException { Scanner sc=new Scanner(System.in); System.out.println("提醒:本程序仅适用于资源3种,进程5个"); Thread.sleep(1000); System.out.println("是否开始(y/n):"); char flag; flag=sc.next().charAt(0); while(flag=='y') { Banker2 b = new Banker2(); b.Input(); b.Calculate(); b.Output(); System.out.println("是否开始(y/n):"); flag=sc.next().charAt(0); } System.out.println("结束。"); } }