// 7 5 3 3 2 2 9 0 2 2 2 2 4 3 3
//0 1 0 2 0 0 3 0 2 2 1 1 0 0 2
package chapter02;
import java.util.Scanner;
public class Bankers {
int[] available= new int[]{3,3,2};//可以利用的资源
static int[][] max = new int[5][3]; //每个进程最大资源数
static int[][] allocation = new int[5][3]; //每个进程目前拥有的资源数
static int[][] need = new int[5][3]; //每个进程需要的资源数
static Scanner in=new Scanner(System.in);
public static void main(String[] args) {
Bankers banker =new Bankers();
setmax();
setalloction();
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
need[i][j]=max[i][j]-allocation[i][j];
}
}
banker.showData();
int request[] =new int[3];//请求线程资源存放的数组
int requestNum;
String source[] =new String[] {"A","B","C"};
String choice =new String();
while(true) {
System.out.println("请输入要请求的进程号(0--4):");
requestNum=in.nextInt();
System.out.println("请输入请求的资源数");
for(int i=0;i<3;i++) {
System.out.println(source[i]+"资源的数目");
request[i]=in.nextInt();
}
banker.change(requestNum,request);
System.out.println("是否在请求分配(y/n)");
choice =in.next();
if(choice.equals("n")) {
break;
}
}
}
boolean change(int inRequestNum, int[] inRequest) {//分配数据
// TODO 自动生成的方法存根
int requestNum=inRequestNum;
int request[]=inRequest;
if(!(request[0]<=need[requestNum][0]&&request[1]<=need[requestNum][1])&&request[2]<=need[requestNum][2]) {
//每一类资源小于当前线程need的资源数
System.out.println("请求的资源超过了所需要的最大值,分配错误");
return false;
}
if(request[0]>available[0]||request[1]>available[1]||request[2]>available[2]) {
//当前线程的某一类请求资源数资源小于资源池对应资源的数量
System.out.println("尚无足够资源分配,必须等待");
return false;
}
for(int i=0;i<3;i++) {
available[i]=available[i]-request[i];//资源池的每类资源减去每类请求资源数量
allocation[requestNum][i]=allocation[requestNum][i]+request[i];//当前线程allocation中每类资源加上每类资源请求数量
need[requestNum][i]=need[requestNum][i]-request[i];//当前线程need中每类资源数量减去每类资源的请求数量
}
boolean flag=chekSafe(available[0],available[1],available[2]);
if(flag==true) {//安全性检查后
System.out.println("能够安全分配");
return true;
}else {
System.out.println("不能够安全分配");
for(int i=0;i<3;i++) {
available[i]=available[i]+request[i];
allocation[requestNum][i]=allocation[requestNum][i]-request[i];
need[requestNum][i]=need[requestNum][i]+request[i];
}
return false;
}
}
boolean chekSafe(int a, int b, int c) {//安全性检查
// TODO 自动生成的方法存根
int work[] =new int[3];
work[0]=a;//available
work[1]=b;
work[2]=c;
int i=0;
boolean finish[]=new boolean[5];
while(i<5) {//寻找一个能够满足的认为完成后才去执行下一个
if(finish[i]==false&&need[i][0]<=work[0]&&need[i][1]<=work[1]&&need[i][2]<=work[2]) {
//找到满足的修改work值,然后i=0,重新从开始的为分配的寻找
System.out.println("分配成功的是"+i);
for(int m=0;m<3;m++) {
work[m]=work[m]+allocation[i][m];
}
finish[i]=true;
i=0;
}else {//如果没有直接i++
i++;
}
}
for(i=0;i<5;i++) {
if(finish[i]==false) {
return false;
}
}
return true;
}
public void showData() {
// TODO 自动生成的方法存根
System.out.println("进程号 Max All Need ");
System.out.println(" A B C A B C A B C");
for(int i = 0;i<5;i++){
System.out.print(i+" ");
for(int m = 0;m<3;m++) System.out.print(max[i][m]+" ");
for(int m = 0;m<3;m++) System.out.print(allocation[i][m]+" ");
for(int m = 0;m<3;m++) System.out.print(need[i][m]+" ");
System.out.println();
}
}
public static void setmax() {
// TODO 自动生成的方法存根
System.out.println("请设置各进程的最大需求矩阵Max:");
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
max[i][j] = in.nextInt();
}
}
}
public static void setalloction() {
// TODO 自动生成的方法存根
System.out.println("请设置请各进程分配矩阵Alloction:");
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
allocation[i][j] = in.nextInt();
}
}
}
}