• 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 block
    119                             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 block
    133                     //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 block
    147                     e.printStackTrace();
    148                 }
    149                 
    150             }
    151         }
    152         
    153     };//run
    154     @Override
    155     public void actionPerformed(ActionEvent a) {
    156         // TODO Auto-generated method stub
    157         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 }
  • 相关阅读:
    TCP/IP:IP的分片与重装
    TCP/IP:IP选项处理
    TCP/IP:IP多播选路
    TCP/IP:IGMP Internet组管理协议
    TCP/IP 插口选项
    TCP/IP: 插口I/O
    TCP/IP 插口层
    leetcode136只出现一次的数字
    leetcode268缺失数字
    letecode242有效字母的异位词
  • 原文地址:https://www.cnblogs.com/qianzhilan/p/4060330.html
Copyright © 2020-2023  润新知