关闭

银行家算法的java编程实现

354人阅读 评论(0) 收藏 举报

主程序:

import java.util.*;

public class BankManager {
	public static void main(String[] args){
		Scanner scanner=new Scanner(System.in);
		TheBanker tb = new TheBanker();
		tb.deadlockAvoidance();//死锁避免
		int gate = 1;
		while(gate!=0){ 
			tb.deadlockDetection();//死锁检测
			System.out.println("如果您要继续分配资源请输入\"1\",退出请输入\"0\"");
			System.out.print("您输入的值为:");
			gate = scanner.nextInt();
			System.out.println();
		}
		System.out.println("使用愉快!期待您下次使用!");
	}
}

银行家算法主要实现:

import java.util.Scanner;

public class TheBanker {
	int m;
	int n;
	int[][] max;
	int[][] maxbak;
	int[][] allocation;
	int[][] allocationbak;
	int[][] need;
	int[][] needbak;
	int[] available;
	int[] availablebak;
	
	public TheBanker(){
		Scanner s=new Scanner(System.in);
		System.out.println("初始化中……");
		System.out.println("请输入系统中的【进程数】和【资源数】");
		m=s.nextInt();
		n=s.nextInt();
		max=new int[m][n];
		maxbak=new int[m][n];
		allocation=new int[m][n];
		allocation=new int[m][n];
		need=new int[m][n];
		needbak=new int[m][n];
		available=new int[n];
		availablebak=new int[n];
		for(int i=0;i<max.length;i++){
			System.out.println("请输入第"+i+"个资源数。");
			for(int j=0;j<max[i].length;j++){
				max[i][j]=s.nextInt();
				maxbak[i][j]=s.nextInt();
			}
		}
		for(int i=0;i<allocation.length;i++){
			System.out.println("请输入第"+i+"个资源分配的数量。");
			for(int j=0;j<allocation[i].length;j++){
				allocation[i][j]=s.nextInt();
				allocationbak[i][j]=s.nextInt();
			}
		}
		for(int i=0;i<need.length;i++){
			for(int j=0;j<need[i].length;j++){
				need[i][j]=max[i][j]-allocation[i][j];
				needbak[i][j]=maxbak[i][j]-allocationbak[i][j];
			}
		}
		for(int i=0;i<available.length;i++){
			System.out.println("请输入系统第"+i+"中资源的剩余量。");
			available[i]=s.nextInt();
			availablebak[i]=available[i];
		}
		System.out.println("初始化===========================");
		System.out.println("MAX ALLOCATION NEED available");
		for(int i=0;i<m;i++){
			System.out.println("P"+i+":");
			for(int j=0;j<n;j++){
				if(max[i][j]>9){
					System.out.print(max[i][j]+" ");
				}else{
					System.out.print(" "+max[i][j]+" ");
				}
			}
			System.out.println(" ");
			for(int j=0;j<n;j++){
				if(allocation[i][j]>9){
					System.out.print(allocation[i][j]+" ");
				}else{
					System.out.print(" "+allocation[i][j]+" ");
				}
			}
			if(i==0){
				System.out.print(" ");
				for(int j=0;j<n;j++){
					if(available[j]>9){
						System.out.print(available[j]+" ");
					}else{
						System.out.print(" "+available[j]+" ");
					}
				}
			}
			System.out.println();
		}
		System.out.println("======完成初始化======");
		System.out.println();
	}
	
	public void deadlockAvoidance(){
		int[] security=new int[m];
		int[] tar=new int[n];
		boolean[] param=new boolean[m];
		int count=0;
		int num1=m+1;
		int num2=m;
		
		while(num1>0){
			for(int i=0;i<m;i++){
				if(param[i]==false){
					param[i]=true;
					for(int j=0;j<n;j++){
						tar[j]=available[j]-need[i][j];
						if(tar[j]<0){
							param[i]=false;
						}
					}
					if(param[i]==true){
						for(int k=0;k<n;k++){
							available[k]=available[k]+allocation[i][k];
						}
						security[count]=i;
						count++;
						num2--;
					}
				}
			}
			num1--;
			while((num2==0)&&(num1>0)){
				System.out.println("【安全序列为:】");
				for(int i=0;i<m;i++){
					if(i==(m-1)){
						System.out.println("P"+security[i]);
					}else{
						System.out.println("P"+security[i]+"->");
					}
				}
				System.out.println();
				System.out.println("=====【死锁避免】结束=====");
				System.out.println();
				return;
			}
		}
	}
	
	public void deadlockDetection(){
		Scanner scanner=new Scanner(System.in);
		int key;
		int[] security=new int[m];
		boolean[] param=new boolean[m];
		int[] temp=new int[n];
		int[] tar=new int[n];
		int count=0;
		int num1=m+1;
		int num2=m;
		for(int i=0;i<m;i++){
			for(int j=0;j<n;j++){
				max[i][j]=maxbak[i][j];
				allocation[i][j]=allocation[i][j];
				need[i][j]=needbak[i][j];
				available[j]=availablebak[j];
			}
		}
		System.out.println();
		System.out.println("死锁检测=========");
		System.out.println("如果你想现在分配系统资源,请输入【进程号】和"+n+"种【资源量】,系统将帮您判断是否可行。");
		System.out.println("您输入的进程号为:");
		key=scanner.nextInt();
		for(int i=0;i<n;i++){
			System.out.println("您要申请的第"+i+"种资源量为");
			temp[i]=scanner.nextInt();
		}
		for(int i=0;i<n;i++){
			allocation[key][i]=allocation[key][i]+temp[i];
			need[key][i]=need[key][i]-temp[i];
			if(need[key][i]<0){
				System.out.println("申请资源大于所剩资源,系统无法分配。");
				for(int k=0;k<m;k++)
				{
					for(int j=0;j<n;j++){
						if(k==0){
							available[j]=availablebak[j];
						}
						max[k][j]=maxbak[k][j];
						allocation[k][j]=allocationbak[k][j];
						need[k][j]=needbak[k][j];
					}
				}
				return;
			}
		}
		System.out.println("申请资源时各个进程的状态:");
		System.out.println("MAX ALLOCATION NEED available");
		for(int i=0;i<m;i++){
			System.out.print("P"+i+":");
			for(int j=0;j<n;j++){
				if(max[i][j]<9){
					System.out.print(max[i][j]+" ");
				}else{
					System.out.println(" "+max[i][j]+" ");
				}
			}
			System.out.println(" ");
			for(int j=0;j<n;j++){
				if(allocation[i][j]<9){
					System.out.print(allocation[i][j]+" ");
				}else{
					System.out.print(" "+allocation[i][j]+" ");
				}
			}
			System.out.println(" ");
			for(int j=0;j<n;j++){
				if(need[i][j]<9){
					System.out.print(need[i][j]+" ");
				}else{
					System.out.print(" "+need[i][j]+" ");
				}
			}
			if(i==0){
				System.out.println(" ");
				for(int j=0;j<n;j++){
					if(available[j]<9){
						System.out.print(available[j]+" ");
					}else{
						System.out.print(" "+available[j]+" ");
					}
				}
			}
			System.out.println();
		}
		System.out.println("======完成效果展示========");
		System.out.println();
		while(num1>0){
			for(int i=0;i<m;i++){
				if(param[i]==false){
					param[i]=true;
					for(int j=0;j<n;j++){
						tar[j]=available[j]=need[i][j];
						if(tar[j]<0){
							param[i]=false;
						}
					}
					if(param[i]=true){
						for(int k=0;k<n;k++){
							available[k]=available[k]+allocation[i][k];
						}
						security[count]=1;
						count++;
						num2--;
					}
				}
			}
			num1--;
			while((num2==0)&&(num1>1)){
				System.out.println("【安全序列】为:");
				for(int i=0;i<m;i++){
					if(i==(m-1)){
						System.out.print("P"+security[i]);
					}else{
						System.out.print("P"+security[i]+"->");
					}
				}
				System.out.println();
				System.out.println("可以产生新的安全序列!系统能将资源分配给P"+key+"!");
				System.out.println("死锁检测结束。");
				System.out.println();
				return;
			}
			while((num2==0)&&(num1>1)){
				System.out.println("抱歉不能产生安全序列,系统无法分配资源。");
				System.out.println("系统不能将资源分配给P"+key+"!");
				System.out.println("死锁检测结束。");
				System.out.println();
				return;
			}
		}
	}
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:111971次
    • 积分:2944
    • 等级:
    • 排名:第12379名
    • 原创:188篇
    • 转载:5篇
    • 译文:1篇
    • 评论:23条
    博客专栏
    最新评论