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 }
时间: 2024-10-27 08:45:11

Java 实现读者与写者的相关文章

读者与写者问题

***********************************************声明****************************************************** 原创作品,出自 "晓风残月xj" 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj). 由于各种原因,可能存在诸多不足,欢迎斧正! *******************************************

JAVA调用C语言写的SO文件

JAVA调用C语言写的SO文件 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 1 // 用JNI实现 2 // 实例: 3 4 // 创建HelloWorld.java 5 class HelloWorld 6 { 7 private native void print(); 8 public static void main(String[] args) 9 { 10 new HelloWorld().p

LoadRunner JAVA Vuser协议手工写脚本Failed to find Classes.zip entry in Classpath问题 .

JAVA Vuser协议手工写脚本Failed to find Classes.zip entry in Classpath问题解决方法: 前提条件: 环境变量:正确的配置了JAVA_HOME,path正确的指明了JAVA_HOME的bin路径和LR的bin路径,classpath中指明了jdk的lib路径和LR的lib路径. 当前LoadRunner的版本是9.0版. 当前的JDK版本是1.7. 一.错误内容如下: 通知: Found jdk version: 1.7.0. [MsgId: M

闲来无事,用Java的软引用写了一个山寨的缓存

闲来无事,用Java的软引用写了一个山寨的缓存 博客分类: java基础 众所周知java中的引用分为 StrongReference.SoftReference.WeakReference.PhantomReference.这几种引用有不同那个的 使用场景,平时我们用的最频繁的也就是StrongReference也就是说形如之这样的引用: Object obj = new Object(); 这种引用就是所谓的强引用,如果此对象没有引用指向它,并且活着的线程无法访问到它(针对垃圾孤岛而言),那

java调用C/C++写的dll(转)

源:java调用C/C++写的dll Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性. Java调用C/C++写好的DLL库时,由于基本数据类型不同.使用字节序列可能有差异,所以在参数传递过程中容易出现问题,DLL中可能需要做相应的转换. 使用Java调用DLL动态链接库的方案通常有三种:JNI, Jawin, Jacob. 其JNI(Java Native Interface)是Java语言本身提供的调用本地已编译的

java程序代码代写、代写tree数据结构作业

java程序代码代写.代写tree数据结构作业实验三:java面向对象编程一.实验目的及要求1.理解 Java 语言是如何体现面向对象编程基本思想的:2.掌握类的声明以及对象的创建:3.了解类的成员变量和成员方法的特性以及类的构造方法的使用. 4.掌握类变量与实例变量以及类方法和实例方法的区别.二.实验内容1. 编写程序模拟两个村庄共同拥有一片森林.编写一个Village类,该类有一个静态的int型成员变量treeAmount用于模拟森林中树木的数量.在主类MainClass的方法中创建两个村庄

java eclipse 作业代写、代做eclipse实验

java eclipse 作业代写.代做eclipse实验<java程序设计>课程实验报告 实验四 继承与多态一.实验目的及要求1.了解如何使用类及其成员的修饰符,掌握方法的继承.重载和覆盖.2.掌握类的继承关系和派生方法.3.掌握多态的概念与使用. 4.掌握接口的定义与使用.二.实验内容(一)类的继承性练习1.进一步理解继承的含义 新类可从现有的类中产生,并保留现有类的成员变量和方法并可根据需要对它们加以修改.新类还可添加新的变量和方法.这种现象就称为类的继承. 当建立一个新类时,不必写出全

AVL 二叉树 JAVA,C,C++ 代写。代写平行二叉树编程作业

AVL 二叉树 JAVA,C,C++ 代写.代写平行二叉树编程作业Assignment 1: AVL & Splay TreesCOMP2003J: Data Structures and Algorithms 2Weight: 10% of final gradeDue Date: 08:00 Monday May 7th 2018Document Version: 1.0IntroductionThis assignment is intended to give you experienc

你知道JAVA项目该怎么写吗?8个技巧让你写项目如虎添翼!

你知道JAVA项目该怎么写吗?学习java,最后一步都是做项目,不管你是自己做小项目练手还是进公司,与团队一起完成项目,做项目就是程序员的归宿.给java新手分享一下java写项目的步骤:1.立项:要做什么东西,最后的要求是什么样,做的广度和深度,即确定项目的边界和范围2.技术可行性:需要哪些技术储备,准备学习哪些内容3.功能:系统具体要实现哪些功能,做出系统用例描述4.数据库设计:e-r图画出5.系统设计:三层模式做还是什么模式,需要的构建有哪些,6.自测或交给其他人测试:项目是否存在bug等