java 模拟公告板 wait -notify 实例

原创 2012年03月29日 22:06:30

关于java多线程中数据同步问题——共享资源,经常用的是生产者和消费这问题,类似的还有公告板的问题。这里给一个实例。

首先说公告板,只有公告板上有内容,浏览者才能读取内容,如果公告板没有内容,那么必须等待先写入,只有写入了才能读取。

所以应该有三个实体类:

一个是MessageBoard即公告板

Reader 读取

Writer 写入

对于通俗的约定来说,公告板开始时是空的,所以必须先写入信息,这里用一个boolean类型变量表示是否有信息如果没有信息,那么等待写的进程,否则可以读

class MessageBoard{//信息板类
    private String message;       
    private boolean ready = false;//信号灯,起始状态先写后读
    public synchronized String read(){//同步的读方法
       while (ready == false){//如果不能读取
            try{
               System.out.println("等待读通知");
               wait();//等待,中断当前线程执行,释放对象锁,直到接到唤醒通知
            } catch (InterruptedException e) { }
    }
    ready = false;//设置可以写标志
    notify();   //唤醒写线程写数据
    return message;
    }
  
   public synchronized void write(String s){
        while (ready == true){//如果不能写
            try{
                System.out.println("等待写通知");
                wait();//等待,中断当前线程执行,直到接到唤醒通知
            }catch (InterruptedException e){ }
        }
        message = s;//写信息
        ready = true;//设置可以读标志
        notify();//唤醒读线程进行读取 
   }
}

 

class Reader extends Thread{//读信息线程类
     private MessageBoard mBoard;
     public Reader(MessageBoard m){//保存信息板对象以供run方法使用
                 mBoard = m;
     }
    
     public void run(){//线程体
         String s = " ";
         boolean reading = true;
         while( reading ){
            s = mBoard.read();//从信息板对象中读取信息
            System.out.println("Reader 读取的信息是: " + s);
            try{
             sleep(300);//读完一条信息后使当前线程睡眠一段时间
            } catch (InterruptedException e) { }
            if( s.equals("logoff") ) //如果读到的信息为logoff则结束读取
               reading = false;
         }
         System.out.println("Finished: 等待 5 秒退出...");
         try{
             sleep( 5000 );//使当前线程睡眠5秒
         }catch (InterruptedException e) { }
      }
}

class Writer extends Thread{//写信息线程类
     private MessageBoard mBoard;
     private String messages[ ]= {//要写入信息板对象中的信息
     "今天是Monday","明天到哪去?","明天是Sunday,在家休息"};
   
    public Writer(MessageBoard m){//保存信息板对象以供run方法使用
         mBoard = m;
    }
   
    public void run(){
       for (int i = 0; i < messages.length; i++){
          mBoard.write(messages[ i ]);//向信息板对象中写入信息
          System.out.println("Writer 写入的信息是:" + messages[i] );
          try{
             sleep((int)(Math.random() * 100));//写完一条信息后使当前线程睡眠一段时间
          } catch (InterruptedException e) { }
       }
       mBoard.write("logoff");//写入结束信息
    }
}

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

从零到一 新手教程 - JAVA Spring MVC

简单明了的Spring MVC 基础教学.  该简单工程的功能流程 : 1. 打开一个 jsp 页面输入必要的信息     2.  将输入的信息存储到 obejct 中    3. 将存储在 obje...
  • YtdxYHZ
  • YtdxYHZ
  • 2016年06月07日 04:12
  • 2796

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

其无前例的springmvc+mybatis后台漂亮框架源代码

说明:JAVA SpringMVC+mybatis(oracle 和 mysql) HTML5 全新高大尚后台框架 bootstrap 内置功能 1.     用户管理:用户是系统操作者,...
  • hj7jay
  • hj7jay
  • 2016年01月05日 14:30
  • 6719

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Java多线程示例(模拟通话,sleep,join,yield,wait,notify,Semaphore)

主线程等待子线程的多种方法 synchronized浅析 sleep 是静态方法,Thread.sleep(xx)谁调用谁睡眠。 join 是合并方法,当前线程调用其他线程xx.join()则等...

Java【多线程知识总结(10)】线程通信之wait()与notify()的运用--模拟指挥官指挥2个连队交替轰炸战区

编写程序:模拟指挥官下达指令要A连向[01战区]连续发射12枚导弹,记为第1次轰炸.A连完成之后向指挥官报告完毕.指挥官告诉A连等等再轰炸.指挥官下达指令要B连向[02战区]连续发射30枚导弹,记为第...

自定义公告板

公告板,我理解的是不是门岗大爷旁边的那个,通知我们最近需要我们注意的事情,我想除了检查卫生没别的了,而且好久也不见更新,还有一个就是电子公告板,流水字那个,就是很多二极管组成的数码管来显示字的那种(而...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 模拟公告板 wait -notify 实例
举报原因:
原因补充:

(最多只允许输入30个字)