首页 > 代码库 > 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 实现读者与写者