银行家算法Word文档下载推荐.docx
- 文档编号:19473091
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:19
- 大小:136.23KB
银行家算法Word文档下载推荐.docx
《银行家算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《银行家算法Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
intID;
//编号
intneed[];
//资源需求数组
intmax[];
//资源最大需求
intallocation[];
//资源分配数组
booleanfinish=false;
process(intID,inta)//构造函数初始化对象
{
this.ID=ID;
need=newint[a];
max=newint[a];
allocation=newint[a];
}
}
classAvailable//系统资源
intcount;
//资源的总量
intsurplus;
//可用资源数量
Available(intcount)
this.count=count;
classMyTableextendsJTable
MyTable(Objecta[][],Objectname[])
super(a,name);
publicbooleanisCellEditable(introw,intcol)//重写该方法使表格的第一列不可编辑
if(col==0)
{returnfalse;
else
{returntrue;
classwinextendsJFrameimplementsActionListener,TextListener
JButtonbtn,btn1,btn3;
JTextAreata;
JPanelp1,p2,p3;
JLabellabel1,label2;
process[]p;
//进程数组
Stringss=null;
intnum=0,n=0;
StringBufferb=newStringBuffer("
进程\\资源状况\tWork\tNeed\tAllocationWork+Allocation\tFinish@"
);
//存储安全序列的详细信息
Containercon;
Availableava[];
//系统资源数组
booleanbl=false;
TextFieldt[]=newTextField[2];
MyTabletable;
Objecta[][];
JScrollPanejp;
Objectname[];
intlabel=0;
win(Strings)
super(s);
for(inti=0;
i<
2;
i++)
t[i]=newTextField(10);
label1=newJLabel("
进程数量"
label2=newJLabel("
资源种类数量"
p1=newJPanel();
p1.add(label1);
p1.add(t[0]);
p1.add(label2);
p1.add(t[1]);
ta=newJTextArea(10,30);
btn=newJButton("
Submit"
p1.add(btn);
con=getContentPane();
con.add(p1,BorderLayout.NORTH);
p2=newJPanel();
btn1=newJButton("
Start"
btn1.setEnabled(false);
//进程运行按钮设置为非激活
btn1.addActionListener(this);
p2.add(btn1);
{
t[i].addTextListener(this);
}
btn.addActionListener(this);
btn3=newJButton("
Sure"
btn3.addActionListener(this);
con.add(btn3,BorderLayout.SOUTH);
setVisible(true);
setBounds(200,200,500,500);
setResizable(false);
//窗口大小不可变
addWindowListener(newWindowAdapter()
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);
}
});
validate();
publicbooleanisNumeric(Stringstr)//判断文本框中的内容是否为数字
for(inti=str.length();
--i>
=0;
)
if(!
Character.isDigit(str.charAt(i)))
returnfalse;
returntrue;
publicbooleanrequest(process[]p,intn,intnum,Available[]ava,Stringss)//进程向系统请求资源
Stringsp=null;
inta[]=newint[num+1];
intj=0,i=0;
if(ss.equals("
Y"
)||ss.equals("
y"
))//进程ID和各资源的请求量随机产生
for(i=0;
a.length;
if(i==0)
a[i]=(int)(Math.random()*n+1);
//随机选择一个进程
}
else
a[i]=(int)(Math.random()*ava[j++].count);
//随机产生对每个资源的请求量
else//自定义输入
i=0;
try
sp=JOptionPane.showInputDialog(this,"
请分别输入进程ID与资源的请求量,用逗号隔开"
catch(Exceptionex){}
StringTokenizerfenxi=newStringTokenizer(sp,"
"
while(fenxi.hasMoreTokens())
a[i++]=Integer.parseInt(fenxi.nextToken());
ta.setText(null);
ta.append("
当前请求资源的进程编号为:
"
+a[0]+"
\n"
i=1;
请求资源量为:
("
for(;
num+1;
ta.append("
+a[i]);
if(i!
=num)
ta.append("
ta.append("
)\n"
booleanbs=true,bd=true;
for(i=1;
if(p[a[0]-1].need[i-1]<
a[i])
bd=false;
for(i=0;
num;
if(a[i+1]>
ava[i].surplus)
bs=false;
if(!
bs&
&
!
bd)
returnfalse;
else
i=1;
j=0;
for(;
i++)//每个资源的可利用资源量减去当前进程的请求量
ava[j].surplus-=a[i];
if(ava[j].surplus<
0)
{
JOptionPane.showMessageDialog(this,"
当前资源无法满足该进程的请求"
break;
else
{j++;
i++)//更新当前资源的获得的已分配资源
p[a[0]-1].need[i]-=a[i+1];
p[a[0]-1].allocation[i]+=a[i+1];
if(j==num)
else{returnfalse;
@SuppressWarnings("
unchecked"
publicvoidcheckSafe(process[]p,Available[]ava,StringBufferb,intn,intnum)
Queuequeue=newLinkedList();
//安全队列
intq[]=newint[num];
{q[i]=ava[i].surplus;
intx=0;
n;
for(intj=0;
j<
j++)
x=0;
for(intk=0;
k<
k++)
if(p[j].need[k]<
=q[k]&
p[j].finish)//当前进程对当前资源的需求小于系统可用资源量
{x++;
else{break;
if(x==num)//系统可用资源满足当前的进程
p[j].finish=true;
//当前进程的请求,系统资源满足,改变其Finish属性
b.append("
+p[j].ID+"
\t"
//将该进程的信息存入变量b中
for(intm=0;
m<
m++)
{
b.append("
+q[m]+"
"
}
+p[j].need[m]+"
+p[j].allocation[m]+"
q[m]+=p[j].allocation[m];
+(q[m])+"
+p[j].finish+"
@"
queue.offer(p[j]);
//加入安全队列
//重头扫描
x=0;
p[i].finish)//判断每个进程的Finish属性
JOptionPane.showMessageDialog(this,"
不存在安全序列!
break;
else{x++;
if(x==n)//进程的finish全为true,即存在安全序列
StringBuffery=newStringBuffer("
for(inti=0;
y.append("
P"
+((process)queue.element()).ID+"
queue.remove();
JOptionPane.showMessageDialog(this,"
存在安全序列:
+newString(y));
Strings=newString(b);
StringTokenizerfenxi=newStringTokenizer(s,"
while(fenxi.hasMoreTokens())//显示资源分配表和安全序列
ta.append(fenxi.nextToken()+"
publicprocess[]needofA(intn,intnum,process[]p,MyTabletable)//计算每个进程完成还需的每个资源的数量
intk=1;
i++)//对进程初始化
k=1;
)//用表格中的数据对进程初始化
p[i].max[j]=Integer.parseInt((String)a[i][k]);
p[i].allocation[j]=Integer.parseInt((String)a[i][k+1]);
k=k+2;
j++;
k=0;
for(intj=1;
(2*num+1);
intx=Integer.parseInt((String)a[i][j]);
inty=Integer.parseInt((String)a[i][j+1]);
p[i].need[k++]=(x-y);
j=j+2;
if(j>
2*num)
returnp;
publicvoidactionPerformed(ActionEvente)
if(e.getSource()==btn)//显示表格
a=newObject[n][2*num+1];
2*num+1;
if(j!
=0)
a[i][j]="
0"
;
else
进程"
+(i+1);
name=newObject[2*num+1];
intj=0;
name[i]="
进程编号"
i++;
MaxFor资源"
+(++j);
name[i+1]="
HavaFor资源"
+(j);
i+=2;
table=newMyTable(a,name);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
//当调整表的大小时,设置表的自动调整模式为不自动调整列的宽度,使用滚动条
table.setCellSelectionEnabled(true);
//设置此表允许同时行选择
jp=newJScrollPane(table);
con.add(jp,BorderLayout.CENTER);
btn.setEnabled(false);
t[0].setEnabled(false);
t[1].setEnabled(false);
if(e.getSource()==btn1)//进程创建完成,开始运行
if(label<
1)//第一次运行
con.remove(jp);
con.add(ta,BorderLayout.CENTER);
validate();
label++;
//执行次数
request(p,n,num,ava,ss))
System.out.println("
212"
当前系统可利用资源无法满足进程的需求!
checkSafe(p,ava,b,n,num);
//安全序列
btn1.setEnabled(false);
if(e.getSource()==btn3)
needofA(n,num,p,table);
//计算每种资源的需求量
i++)//计算每种资源的可用资源数量
intsum=ava[i].count;
for(intj=0;
sum-=p[j].allocation[i];
ava[i].surplus=sum;
btn1.setEnabled(true);
con.remove(btn3);
con.add(p2,BorderLayout.SOUTH);
ss=JOptionPane.showInputDialog(this,"
进程与请求随机产生清输入Y,自定义请输入N!
publicvoidtextValueChanged(TextEvente)
if(e.getSource()==t[1])
if(isNumeric(t[1].getText()))
Strings1=JOptionPane.showInputDialog("
请分别输入"
+t[1].getText()+"
个系统资源的总量,用逗号隔开"
StringTokenizerfenxi=newStringTokenizer(s1,"
num=fenxi.countTokens();
inti=0;
ava=newAvailable[num];
Strings=fenxi.nextToken();
if(isNumeric(s))
ava[i++]=newAvailable(Integer.parseInt(s));
//创建系统资源
JOptionPane.showMessageDialog(this,"
系统资源数目不能为字符!
break;
p=newprocess[Integer.parseInt(t[0].getText())];
for(i=0;
p[i]=newprocess(i+1,num);
//创建进程
系统种类数不能为字符!
catch(Exceptione0){}
if(e.getSource()==t[0])
if(t[0].getText().length()<
1)
进程数不能为空!
if(isNumeric(t[0].getText()))
{n=Integer.parseInt(t[0].getText());
{JOptionPane.showMessageDialog(this,"
进程数只能为数字!
}catch(Exceptionee){}
}}}
publicclassbanker
publicstaticvoidmain(Stringa[])
{newwin("
银行家算法"
四、测试数据与实验结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 算法