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");//写入结束信息
    }
}

公告栏代码(java 滚动)

  • 2010年08月26日 22:24
  • 21KB
  • 下载

Web网站通知系统设计

写在前面: 通知系统是网站信息传播机制的重要的一部分,足够写一大章来说明。本文只梳理设计原则,后续相关内容会持续更新。 这里的通知包括但不限于公告、提醒或消息(不同使用场景下的功能定义不同)。 关于各...
  • he90227
  • he90227
  • 2016年08月17日 16:17
  • 2002

公告管理系统java源码

  • 2009年03月28日 16:54
  • 1.64MB
  • 下载

Direct-X学习笔记--公告板

// D3DDemo.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "D3DDemo.h" #include "DirectInput.h" ...
  • puppet_master
  • puppet_master
  • 2015年08月13日 00:57
  • 891

【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉的诡计:公告板(Billboard)技术

I'm back~,这段时间大家久等了~ 现在大家看到的,就是【Visual C++】游戏开发系列文章第三季中作为正式回归的第一篇文章了。 在这篇文章中,我们一起详细探讨了游戏编程中公告板技术的方...
  • true11false
  • true11false
  • 2014年07月25日 22:58
  • 996

【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉的诡计:公告板(Billboard)技术

现在大家看到的,就是【Visual C++】游戏开发系列文章第三季中作为正式回归的第一篇文章了。 在这篇文章中,我们一起详细探讨了游戏编程中公告板技术的方方面面,有“深入”的过程分析,也有“浅出”的大...
  • zhmxy555
  • zhmxy555
  • 2013年10月28日 00:05
  • 20097

python项目练习七:自定义公告板

这依然是一个cgi的项目,有了前面的一个项目作为基础,这个里面没有什么难点。不过,和书上不同的是,我这里使用的数据库是mysql,所以有兴趣的童鞋,可以参考一下。 首先建立一张mysql的数据表...
  • tommyjsj
  • tommyjsj
  • 2013年11月14日 20:54
  • 1755

【Android之垂直翻页公告】

源码github地址是:https://github.com/sfsheng0322/MarqueeView 该源码是android studio版本,本文最后提供的是eclipse版本,以...
  • bear_huangzhen
  • bear_huangzhen
  • 2016年06月14日 11:41
  • 1416

cocos2d-x学习日志(15) --公告栏的实现(文字左右移动)

公告栏用的是CClayer(层)或者node节点,锚点位置是(0,0),文字信息使用CCLabelTTF保存,锚点位置是(0,0),使用的时候将它加入到node里面就好了 文字移动的思路是: ...
  • my183100521
  • my183100521
  • 2014年03月11日 17:36
  • 2404

jquery公告栏

Wordpress:将文章自动显示为两列 电影:《2012》真的有那一天吗?探索频道为你揭露 资讯:2009年11月编程语言排行榜 租房:忙碌一周,房子...
  • ldw598156412
  • ldw598156412
  • 2014年11月23日 23:30
  • 603
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 模拟公告板 wait -notify 实例
举报原因:
原因补充:

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