📄 banker.java
字号:
}
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 + -