银行家算法:

public class Demo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] available=new int[]{1,1,2};
		int[][] Max=new int[][]{{3,2,2},{6,1,3},{3,1,4},{4,2,2}};
		int[][] Allocation=new int[][] {{1,0,0},{5,1,1},{2,1,1},{0,0,2}};
		int[][] Need=new int[Max.length][Max[0].length];
		int[] finish=new int[] {1,1,1,1};
		int[] shunxu=new int[4];//记录安全序列
		int[] can=new int[4];//如果空闲资源大于进程需求资源,像对应的数组中装入能获取到的最大资源数
		int i,j;
		int cul=0;
		int tar = -1;
		for(i=0;i<Max.length;i++) {//计算每个进程的每一部分还需要多少资源
			for(j=0;j<Max[0].length;j++) {
				Need[i][j]=Max[i][j]-Allocation[i][j];
			}
		}
		i=0;
		j=0;
		System.out.println("资源变化顺序为");
		while(cul<4) {
			for(i=0;i<Allocation.length;i++) {
				if(finish[i]!=0) {
					for(j=0;j<Allocation[0].length;j++) {
						if(available[j]<Need[i][j]) {//如果进程所需对应的资源无法获取完整,跳出当前进程;
							break;
						}
					}
					if(j==3) {//如果每一项资源都能满足,则记录下来
						can[i]=Allocation[i][0]+Allocation[i][1]+Allocation[i][2];
					}
				}
			}
			int max=can[0];
			for(i=1;i<can.length;i++) {//判断完成哪一个进程能获得最大的数的资源
				if(can[i]>max) {
					max=can[i];
					tar=i;
				}
			}
			if(max==0) {
				System.out.println("没有安全序列");
				break;
			}
			for(i=0;i<Max[0].length;i++) {
				available[i]+=Allocation[tar][i];
				System.out.print(available[i]+" ");
				finish[tar]=0;
			}
			can[tar]=0;
			shunxu[cul]=tar;
			System.out.println();
			cul++;
			tar=0;
		}
		System.out.println("安全序列为");
		for(int i1=0;i1&t;4;i1++) {
			System.out.println(shunxu[i1]+1);
		}
	}
}