⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 banker.java

📁 采用java语言实现的模拟银行家算法
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
				}
				else{
					pro1.addA(pro1.getProcess_F(xia));//改变A的值
					printSafe();//打印安全序列
JOptionPane.showMessageDialog(null,"系统是安全的","dhn",JOptionPane.INFORMATION_MESSAGE);


				}
			}
			else{
JOptionPane.showMessageDialog(null,"系统资源不能满足您的要求","dhn",JOptionPane.INFORMATION_MESSAGE);
				//**************//推出系统
			}
		}
		else{
JOptionPane.showMessageDialog(null,"您所申请的资源超出了进程所宣布的最大值","dhn",JOptionPane.INFORMATION_MESSAGE);
			//**************提示系统出错
		}
	}//end if button8

	}//end method actionPerfored
	}//end class ActionListener
	
	public boolean isSafe( process pro2 )
	{
		int a=0;
		boolean flag=true;
		if(!pro2.isAllOver(row))//判断pro2是否完成了,如果没有完成则执行while
		{
JOptionPane.showMessageDialog(null,"所有进程尚未完成","dhn",JOptionPane.INFORMATION_MESSAGE);
		while(flag)
		   {
			a=findLessA(pro2);//********************找一个所许资源小于A且进程完了的下标,如果返回-1则表示没有找到
JOptionPane.showMessageDialog(null,"找到了已小于A的进程"+a,"dhn",JOptionPane.INFORMATION_MESSAGE);
			if( a==-1){
				flag=false;
			 	return false;//提示meiyou 找到  不安全
				}
			else{
				if(!pro2.isOver(a))
				{
					testSand(pro2,a);//测试分配...只需改变A的值和改变Over的值	//********
					safe[se]=a;
					se++;
JOptionPane.showMessageDialog(null,"进程"+a+"现在已经完成   安全下表"+se,"dhn",JOptionPane.INFORMATION_MESSAGE);
				}
				if(pro2.isOver(a)){
					if(pro2.isAllOver(row)){
JOptionPane.showMessageDialog(null,"所有进程已经完成","dhn",JOptionPane.INFORMATION_MESSAGE);
						return true;//如果进程pro2完了,则返回
					}
				}
			}//if a==-1
		   }//while

		}//if isAllOver
		return true;//是安全的
	}

	public boolean isRlessThan(int S[])
	{
		for(int ch=0;ch<col;ch++)
		{
			if(R[ch]>S[ch]) return false;
		}
		return true;
	}

	public void giveResource( process pro,int xia,int R[] )
	{
		pro.subS(xia,R);
		pro.addF(xia,R);
		pro.subA(R);
		pro.setOver(xia);
JOptionPane.showMessageDialog(null,"把进程"+xia+"的完成标记设置成功","dhn",JOptionPane.INFORMATION_MESSAGE);
	}
	
	public void goBack(process pro,int xia)
	{
		pro.addS(xia,R);
		pro.subF(xia,R);
		pro.addA(R);	
		pro.setOver(xia,0);
	}
	public int findLessA(process pro)
	{
		int M[]=new int[10],N[]=new int[10];
		int j=0;		
		N=pro.getProcess_A();
		for( int i=0;i<row;i++)
		{
			if(pro.isOver(i)) {
JOptionPane.showMessageDialog(null,"进程"+i+"已经完成*******","dhn",JOptionPane.INFORMATION_MESSAGE);
			}else{
			M=pro.getProcess_S(i);
			for(j=0;j<col;j++)//判断是否进程i中所有的资源都小于A
			{
				if(M[j]>N[j]) {j=0;break;}
			}	
			if(j==col) return i;
			}
		}
		return -1;
	}

	public void testSand( process pro,int xia)//给pro的xia进程分配
	{
		pro.addA(pro.getProcess_F(xia));//给进程pro的A加上进程xia的已分配资源
		pro.setOver(xia);//将进程 xia设置成已完成
	}

	public void printSafe()
	{
		String outSafe="安全序列:  ";
		for(int i=0;i<se;i++)
		{
			outSafe=outSafe+"\t"+safe[i];
		}
JOptionPane.showMessageDialog(null,outSafe,"dhn",JOptionPane.INFORMATION_MESSAGE);

	}
}//end class banker

class process{//进程对象
	
	private int S[][],F[][],A[];
	private String name[];
	private int Over[]=new int[10];//进程完成数组,第i个进程完成了就将Over[i]的值设置成1;


	public process(int row,int col){
	
 	name=new String[10];
	S=new int[10][10];
	F=new int[10][10];
	A=new int[10];
	for(int i=0;i<row;i++)
	{
	name[i]=new String( "" );
	}
	
	}//end struct method

	public process( process pro,int row,int col )//row 是进程数目  col是资源数目
	{
 	name=new String[10];
	S=new int[10][10];
	F=new int[10][10];
	A=new int[10];
	
	int s2[][]=new int[10][10];
	int f2[][]=new int[10][10];
	int a2[]=new int[10];
	int over2[]=new int[10];
	String name2[]=new String[10];

	s2=pro.getProcess_S();
	f2=pro.getProcess_F();
	a2=pro.getProcess_A();
	over2=pro.getOver();
	name2=pro.getProcess_name();
	for(int i=0;i<row;i++)
	{
	name[i]=new String( name2[i] );
	}
	for(int a=0;a<row;a++)
	{
		for(int b=0;b<col;b++)
		{
			S[a][b]=s2[a][b];
			F[a][b]=f2[a][b];
		}
	}
	for(int t=0;t<col;t++)
	{
	A[t]=a2[t];
	}
	for(int t=0;t<row;t++)
	{
	Over[t]=over2[t];
	}

	}//end method process

	public void setA( int a,int b )//a为下标,b为资源
	{
	A[a]=b;
	}

	public String getName(int a)//a为进程下标
	{
		return name[a];
	}

	public void setName( String names,int a )//a为进程下标
	{
		name[a]= names ;	
	}

	public void setS( int s,int x,int y )//设置进程x尚需的资源y为s
	{
		S[x][y]=s;
	}

	public void setF( int f,int x,int y )//设置进程x已有的资源y为f
	{
		F[x][y]=f;
	}

	public int getS( int x,int y )//取得进程x尚需的资源y
	{
		return S[x][y];
	}

	public int getA( int x )//取得系统已有的资源A[x]
	{
		return A[x];
	}
	
	public boolean isOver( int x )//判断进程是否完成
	{
JOptionPane.showMessageDialog(null,"isOver"+x+Over[x],"dhn",JOptionPane.INFORMATION_MESSAGE);
		if( Over[x]==1 )
		{
			return true;//如果完成了,则返回1
		}
		else{
			return false;//如果没有完成,则返回0
		}
	}

	public void setOver( int x )//将指定
	{
		Over[x]=1;
	}
	public void setOver( int x,int a )//将指定
	{
		Over[x]=0;
	}


	public int findName( String names )//返回进程名为names的进程下标
	{
JOptionPane.showMessageDialog(null,"查找名字","dhn",JOptionPane.INFORMATION_MESSAGE);
	       for( int i=0;i<name.length;i++ )
		{
			if( name[i].compareTo( names )==0)
				return i;
JOptionPane.showMessageDialog(null,"第"+i+"个名字","dhn",JOptionPane.INFORMATION_MESSAGE);
		}

JOptionPane.showMessageDialog(null,"没有找到","dhn",JOptionPane.INFORMATION_MESSAGE);
       		return -1;//如果没有找到,则返回-1
	}
	
	public void clearOver()
	{
		for(int j=0;j<Over.length;j++)
		{
			Over[j]=0;
		}
	}
	public int[] getProcess_S( int x )//返回某个进程的所许资源
	{
		return S[x];
	}

	public int[] getProcess_A()//返回某个进程对象的系统资源
	{
		return A;
	}

	public int[] getProcess_F(int xia)//返回某个进程对象的系统资源
	{
		return F[xia];
	}

	public int[][] getProcess_S()//返回某个进程的所许资源
	{
JOptionPane.showMessageDialog(null,"返回S","dhn",JOptionPane.INFORMATION_MESSAGE);
		return S;
	}

	public int[][] getProcess_F()//返回某个进程对象的系统资源
	{
		return F;
	}


	public boolean isAllOver(int row)//判断进程是否已经全完了,如果全完了返回1
	{
		for(int t=0;t<row;t++)
		{
			if(Over[t]==0) return false;
		}
		return true;
	}

	public void subS(int xia ,int M[])//修改进程已有的资源
	{

JOptionPane.showMessageDialog(null,"给S减R","dhn",JOptionPane.INFORMATION_MESSAGE);
		for(int i=0;i<10;i++)
		{
			S[xia][i]=S[xia][i]-M[i];

//JOptionPane.showMessageDialog(null,"给S减R"+S[xia][i],"dhn",JOptionPane.INFORMATION_MESSAGE);
		}
	}

	public void addF(int xia,int M[])//修改进程尚需的资源
	{
//JOptionPane.showMessageDialog(null,"给F加R","dhn",JOptionPane.INFORMATION_MESSAGE);
		for(int i=0;i<10;i++)
		{
			F[xia][i]=F[xia][i]+M[i];

//JOptionPane.showMessageDialog(null,"给F加R"+M[i]+"**"+F[xia][i],"dhn",JOptionPane.INFORMATION_MESSAGE);
		}
	}
	
	public void subA(int M[])//修改进程已有的资源
	{
JOptionPane.showMessageDialog(null,"给A加R","dhn",JOptionPane.INFORMATION_MESSAGE);
		for(int i=0;i<10;i++)
		{
			A[i]=A[i]-M[i];
		}
	}

	public void addS(int xia ,int M[])// 修改进程尚需的资源
	{
		for(int i=0;i<10;i++)
		{
			S[xia][i]=S[xia][i]+M[i];
		}
	}

	public void subF(int xia,int M[])//修改进程已经分配的资源
	{
		for(int i=0;i<10;i++)
		{
			F[xia][i]=F[xia][i]-M[i];
		}
	}
	
	public void addA(int M[])//给系统已有资源加上M[]
	{
		for(int i=0;i<10;i++)
		{
			A[i]=A[i]+M[i];
		}
	}

	public  String printS(String output)//打印进程尚需的资源
	{
		//output="******************";
		for(int i=0;i<10;i++)
		{
			output=output+name[i]+"\t";
			for(int j=0;j<10;j++)
			{
				output=output+S[i][j]+"\t";
			}

			output=output+"\n";
		}
		return output;
	}

	public String printF(String output)//打印进程已经分配的资源
	{
		for(int i=0;i<10;i++)
		{
			output=output+name[i]+"\t";
			for(int j=0;j<10;j++)
			{
				output=output+F[i][j]+"\t";
			}

			output=output+"\n";
		}
		return output;
	}

	public String printA(String output)//打印系统已有资源
	{
		for(int i=0;i<10;i++)
		{
			output=output+"资源"+i+"\t";
			output=output+A[i]+"\t"+"\n";
		}
		return output;
	}

	public int[] getOver()//取得进程完成数组
	{
		return Over;
	}

	public String[] getProcess_name()//取得进程名数组
	{
		return name;
	}
}//end class process

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -