天下·网吧联盟
登录 申请网盟通行证 忘记密码 逛逛论坛
当前位置:首页 >> 技术纵横 >> 编程基地 >> JAVA进阶简单Thread缓冲池实现
JAVA进阶简单Thread缓冲池实现
作者:xuyy_cn   2008年03月20日  来源:赛迪网
收藏本文  打印此页  举报本文  评论  投稿

 
 在应用中,我们常常需要Thread缓冲池来做一些事以提高程序的效率和并发性。本文演示了如何利用Queue这种数据结构实现一个简单的Thread缓冲池。

   一个Thread缓冲池可以设计成以下这样:缓冲池由几个工作Thread和一个Queue组成,Client负责把任务放到Queue里面(put方法),而工作Thread就依次取出这些任务并执行它们(get方法)。

   Queue的一个经典实现是使用一个循环数组(这个实现在很多数据结构的书上都有介绍),如一个大小为size的数组,这个循环数组可以被想象成首尾相连的一个环。oldest指向Queue中最老的数据所在的位置,next指向下一个可以放新数据的位置。

   放入一个新数据到next的位置后,需要更新next:next = (next + 1) % size;

   从oldest位置取出一个数据后,需要更新oldest:oldest = (oldest + 1) % size;
 
   当oldest == next的时候,Queue为空,

   当(next + 1) % size == oldest的时候,Queue为满。

   (注意:为了区分Queue为空和为满的情况,实际上Queue里面最多能放size-1个数据。)

   因为这个Queue会同时被多个线程访问,需要考虑在这种情况下Queue如何工作。首先,Queue需要是线程安全的,可以用Java里的synchronized关键字来确保同时只有一个Thread在访问Queue.

   我们还可以注意到当Queue为空的时候,get操作是无法进行的;当Queue为满的时候,put操作又是无法进行的。在多线程访问遇到这种情况时,一般希望执行操作的线程可以等待(block)直到该操作可以进行下去。比如,但一个Thread在一个空Queue上执行get方法的时候,这个 Thread应当等待(block),直到另外的Thread执行该Queue的put方法后,再继续执行下去。在Java里面,Object对象的 wait(),notify()方法提供了这样的功能。

声明:本站所发表的文章与图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系邮箱:editor@untx.com。
网友评论
昵称: 验证码: 看不到图片?点击刷新验证码。

* 请各位网友遵纪守法并注意语言文明。 * 已登陆的会员才能发表评论。
*《互联网电子公告服务管理规定》 *《全国人大常委会关于维护互联网安全的规定》

网盟藏经阁

百年奥运 安全先行 百年奥运 安全先行
  作为世界三大竞技比赛的体育项目之一(奥运会、世界杯、F1)─奥运会无疑会成为世界的焦点,今夏即....[详情]
无盘网吧利好多多 无盘网吧利好多多
  中国人的无盘工作系统,大约在1997年走向社会,走进网吧。历经10多年的磨砺,无盘工作系统逐渐得到....[详情]
教你做网吧广告——百万格子网吧版 教你做网吧广告——百万格子网吧版
在网吧做广告已非新鲜事,但如何充分发挥网吧优势,“压榨”出更多的广告,想必大家也在绞尽脑汁了[详情]
不用拆机箱,不用Ghost,飞速传系统 不用拆机箱,不用Ghost,飞速传系..
  用ghost server进行网络克隆是个不错的主意,但是,克隆之前要给母盘作准确无误的整盘镜像,克隆过....[详情]
网管必学:将“SP3”集成至XP安装盘 网管必学:将“SP3”集成至XP安装..
  随着最近Vista的不断炒作,相信短期内Windows XP SP3的正式版本是发布无望了,但正所谓自己动手丰....[详情]

百度主题推广

网站地图 | 关于天下 | 商务合作 | 广告投放 | 投稿指南 | 联系方式 | 友情链接 | 版权声明 | 免责条款 | 隐私保护
新 宽 联 数 码] 中国网吧增值业务领头羊
新宽联数码 2000 - 2008 建设 - 维护 - 版权所有 粤B2-20040365号
广州网监-报警岗亭