1、 int ID;/编号 int need;/资源需求数组 int max;/资源最大需求 int allocation;/资源分配数组 boolean finish=false; process(int ID,int a)/构造函数初始化对象 this.ID=ID; need=new inta; max=new inta; allocation=new inta; class Available/系统资源 int count;/资源的总量 int surplus;/可用资源数量 Available(int count) this.count=count;class MyTable extend
2、s JTable MyTable(Object a,Object name) super(a,name); public boolean isCellEditable(int row, int col)/重写该方法使表格的第一列不可编辑 if (col = 0) return false; else return true;class win extends JFrame implements ActionListener,TextListener JButton btn,btn1,btn3; JTextArea ta; JPanel p1,p2,p3; JLabel label1,label
3、2; processp;/进程数组 String ss=null; int num=0,n=0; StringBuffer b=new StringBuffer(进程资源状况t WorktNeedtAllocation Work+AllocationtFinish);/存储安全序列的详细信息 Container con; Available ava;/系统资源数组 boolean bl=false; TextField t=new TextField2; MyTable table; Object a; JScrollPane jp; Object name; int label=0; win
4、(String s) super(s); for(int i=0;i=0;) if(!Character.isDigit(str.charAt(i) return false; return true; public boolean request(processp,int n,int num,Availableava,String ss)/进程向系统请求资源 String sp=null; int a=new intnum+1; int j=0,i=0; if(ss.equals(Y)|ss.equals(y)/进程ID和各资源的请求量随机产生 for(i=0;a.length; if(i=
5、0) ai=(int)(Math.random()*n+1);/随机选择一个进程 else ai=(int)(Math.random()*avaj+.count);/随机产生对每个资源的请求量 else/自定义输入 i=0; try sp=JOptionPane.showInputDialog(this,请分别输入进程ID与资源的请求量,用逗号隔开 catch(Exception ex) StringTokenizer fenxi=new StringTokenizer(sp, while(fenxi.hasMoreTokens() ai+=Integer.parseInt(fenxi.nex
6、tToken(); ta.setText(null); ta.append(当前请求资源的进程编号为:+a0+n i=1;请求资源量为:( for(;num+1; ta.append(+ai); if(i!=num) ta.append( ta.append()n boolean bs=true,bd=true; for(i=1; if(pa0-1.needi-1avai.surplus) bs=false; if(!bs&!bd) return false; else i=1;j=0; for(;i+)/每个资源的可利用资源量减去当前进程的请求量 avaj.surplus-=ai; if(a
7、vaj.surplus0) JOptionPane.showMessageDialog(this,当前资源无法满足该进程的请求 break; else j+;i+)/更新当前资源的获得的已分配资源 pa0-1.needi-=ai+1; pa0-1.allocationi+=ai+1; if(j=num) elsereturn false; SuppressWarnings(unchecked public void checkSafe(processp,Availableava,StringBuffer b,int n,int num) Queue queue=new LinkedList()
8、;/安全队列 int q=new intnum; qi=avai.surplus; int x=0;n; for(int j=0;jj+) x=0; for(int k=0;kk+) if(pj.needk=qk&pj.finish)/当前进程对当前资源的需求小于系统可用资源量 x+; elsebreak; if(x=num)/系统可用资源满足当前的进程 pj.finish=true;/当前进程的请求,系统资源满足,改变其Finish属性 b.append(+pj.ID+t/将该进程的信息存入变量b中 for(int m=0;m2*num) return p; public void acti
9、onPerformed(ActionEvent e) if(e.getSource()=btn)/显示表格 a=new Objectn2*num+1;2*num+1; if(j!=0) aij=0; else进程+(i+1); name=new Object2*num+1; int j=0; namei=进程编号 i+;Max For 资源+(+j); namei+1=Hava For 资源+(j); i+=2; table=new MyTable(a,name); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);/当调整表的大小时,设置表的自动
10、调整模式为不自动调整列的宽度,使用滚动条 table.setCellSelectionEnabled(true);/设置此表允许同时行选择 jp=new JScrollPane(table); con.add(jp,BorderLayout.CENTER); btn.setEnabled(false); t0.setEnabled(false); t1.setEnabled(false); if(e.getSource()=btn1)/进程创建完成,开始运行 if(label1)/第一次运行 con.remove(jp); con.add(ta,BorderLayout.CENTER); va
11、lidate(); 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+)/计算每种资源的可用资源数量 int sum=avai.count; for(int j=0; sum-=pj.allocationi; avai.surplus=sum; btn1.setEn
12、abled(true); con.remove(btn3); con.add(p2,BorderLayout.SOUTH); ss=JOptionPane.showInputDialog(this,进程与请求随机产生清输入Y,自定义请输入N! public void textValueChanged(TextEvent e) if(e.getSource()=t1) if(isNumeric(t1.getText() String s1=JOptionPane.showInputDialog(请分别输入+t1.getText()+个系统资源的总量,用逗号隔开 StringTokenizer f
13、enxi=new StringTokenizer(s1, num=fenxi.countTokens(); int i=0; ava=new Availablenum; String s=fenxi.nextToken(); if(isNumeric(s) avai+=new Available(Integer.parseInt(s);/创建系统资源 JOptionPane.showMessageDialog(this,系统资源数目不能为字符! break; p=new processInteger.parseInt(t0.getText(); for(i=0; pi=new process(
14、i+1,num);/创建进程系统种类数不能为字符! catch(Exception e0) if(e.getSource()=t0) if(t0.getText().length()1)进程数不能为空! if(isNumeric(t0.getText() n=Integer.parseInt(t0.getText(); JOptionPane.showMessageDialog(this,进程数只能为数字! catch(Exception ee) public class banker public static void main(String a) new win(银行家算法四、测试数据与实验结果
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1