银行家算法的java编程实现

原创 2015年07月10日 15:00:23

主程序:

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;
			}
		}
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

用java实现银行家算法

银行家算法核心是 先寻找满足系统当前剩余的资源量(avaliable )>=进程运行所需的资源数的进程(need),再假设这个进程安全校验是成功的,当这个进程运行完毕后,释放资源后,现在系统当前剩余...

银行家算法编程(JAVA)

  • 2016年06月02日 22:56
  • 83KB
  • 下载

Java实现银行家算法

银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。 下面...

银行家算法java实现

银行家算法问题描述        银行家算法(Banker’s Algorithm)是一个避免死锁(Deadlock)的著名算法,由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产...

java实现银行家算法

南昌航空大学实验报告 课程名称:  操作系统       实验名称:  _避免死锁(银行家算法) 班级:110462          姓名:XXX    学号:  11046208 一 实...

银行家算法(Java实现)

银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。我们可以把操作系统看作是银行家,操作系统管理...

银行家算法——java实现

package Banker;   import java.util.Scanner;   public class TestBanker {   public static void ...

银行家算法java实现带UI界面

  • 2012年04月05日 22:44
  • 714KB
  • 下载

银行家算法(java)

package com.liuyang.banker; import java.util.Arrays; import java.util.Collections; import java.util...
  • jlhnxly
  • jlhnxly
  • 2012年01月07日 19:37
  • 1464
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:银行家算法的java编程实现
举报原因:
原因补充:

(最多只允许输入30个字)