首页 > 代码库 > Java 实现读者与写者
Java 实现读者与写者
1 package r_d; 2 /** 3 * 以下读者与写者实验以swing为主要实现 4 */ 5 import java.awt.*; 6 import javax.swing.*; 7 import javax.swing.border.TitledBorder; 8 9 import java.awt.event.*; 10 import java.util.Random; 11 import java.util.concurrent.Semaphore; 12 import java.util.concurrent.Executors; 13 import java.util.concurrent.ExecutorService; 14 public class Rw2 extends JFrame implements ActionListener{ 15 /** 16 * 17 */ 18 private static final long serialVersionUID = 1L; 19 20 final Semaphore mutex=new Semaphore(1); 21 final Semaphore Rmutex=new Semaphore(5); 22 private boolean r=false; 23 private int counter=0; 24 ExecutorService exc=Executors.newCachedThreadPool(); 25 private Random ran=new Random(); 26 //界面设计控件 27 Container con=getContentPane(); 28 JLabel bName,blank; 29 JLabel []read=new JLabel[5]; 30 JLabel []w=new JLabel[2]; 31 JTextArea tf_bContent; 32 JTextArea []tf_r=new JTextArea[5]; 33 JTextArea []tf_w=new JTextArea[2]; 34 Button b_r,b_w; 35 36 public Rw2(){ 37 con.setLayout(null); 38 setTitle("读者和写者问题"); 39 bName=new JLabel("三国演义"); 40 bName.setBounds(30, 30, 60, 40); 41 tf_bContent=new JTextArea("《三国演义》中国古典四大名著之一"); 42 tf_bContent.setBounds(30, 60, 300, 80); 43 tf_bContent.setBorder(new TitledBorder(null,"",TitledBorder.DEFAULT_JUSTIFICATION, 44 TitledBorder.DEFAULT_POSITION,null,Color.blue)); 45 blank=new JLabel(); 46 //读者控件初始化 47 for(int i=0;i<5;i++) 48 { 49 50 read[i]=new JLabel(); 51 read[i].setText("读者"+String.valueOf(i)); 52 read[i].setBounds(10, 150+60*i, 60, 50); 53 54 tf_r[i]=new JTextArea(); 55 tf_r[i].setBounds(60, 150+60*i, 100, 50); 56 tf_r[i].setBorder(new TitledBorder(null, "", TitledBorder.DEFAULT_JUSTIFICATION, 57 TitledBorder.DEFAULT_POSITION, null, Color.BLUE)); 58 59 } 60 for(int j=0;j<2;j++) 61 { 62 w[j]=new JLabel(); 63 w[j].setText("写者"+String.valueOf(j)); 64 w[j].setBounds(200, 150+60*j, 100, 50); 65 tf_w[j]=new JTextArea(); 66 tf_w[j].setBounds(260, 150+60*j, 100, 50); 67 tf_w[j].setBorder(new TitledBorder(null, "", TitledBorder.DEFAULT_JUSTIFICATION, 68 TitledBorder.DEFAULT_POSITION, null, Color.BLUE)); 69 } 70 71 b_r=new Button("启动读者线程"); 72 b_w=new Button("启动写者线程"); 73 b_r.setBounds(400,100, 100, 50); 74 b_w.setBounds(510,100, 100, 50); 75 //安装行动监视器 76 b_r.addActionListener(this); 77 b_w.addActionListener(this); 78 79 80 con.add(bName); 81 con.add(tf_bContent); 82 for(int i=0;i<5;i++) 83 { 84 con.add(tf_r[i]); 85 con.add(read[i]); 86 } 87 for(int j=0;j<2;j++) 88 { 89 90 con.add(w[j]); 91 con.add(tf_w[j]); 92 } 93 con.add(b_r); 94 con.add(b_w); 95 setSize(800,500); 96 setVisible(true); 97 //关闭窗口 98 addWindowListener(new WindowAdapter(){ 99 public void windowClosing(WindowEvent e){100 System.exit(0);101 } 102 });103 104 }105 106 107 Runnable run=new Runnable(){108 public void run(){109 if(r)110 {111 try {112 Rmutex.acquire();113 if(counter==0)114 {115 try {116 mutex.acquire(); 117 } catch (InterruptedException e) {118 // TODO Auto-generated catch block119 e.printStackTrace();120 }121 }122 tf_r[counter].setText(tf_bContent.getText().toString()); 123 counter++;124 Thread.sleep((long)(Math.random()*10000));125 tf_r[counter-1].setText("");126 if(counter==1)127 mutex.release();128 counter--;129 Rmutex.release();130 131 } catch (InterruptedException e) {132 // TODO Auto-generated catch block133 //e.printStackTrace();134 }135 136 137 138 }else if(!r)139 {140 try {141 mutex.acquire();142 tf_bContent.setText(tf_w[ran.nextInt(1)].getText().toString());143 Thread.sleep((long)(Math.random()*10000));144 mutex.release();145 } catch (InterruptedException e) {146 // TODO Auto-generated catch block147 e.printStackTrace();148 }149 150 }151 }152 153 };//run154 @Override155 public void actionPerformed(ActionEvent a) {156 // TODO Auto-generated method stub157 if(a.getSource()==b_r)158 {159 r=true;160 exc.execute(run);161 162 }163 else if(a.getSource()==b_w){164 r=false;165 exc.execute(run);166 }167 168 }169 public static void main(String args[])170 {171 new Rw2();172 }173 }
Java 实现读者与写者
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。