社区
Java SE
帖子详情
关于避免轮询而采用事件驱动得问题
ghosert
2006-08-20 09:26:12
我在设计多线程时经常碰到这样一个问题。例如在经典的product-customer模式中,有时并非我的product线程能控制自己生产的“产品”来供customer消费,而是要向外部系统要数据,这个时候不可避免要用product线程轮询外部系统的状态,直到得到“产品”。例如:轮询某个文件夹下某个文件是否已经存在,不存在就睡眠一段时间继续轮询。显然这样比较低效,请问有什么消息驱动的方式可以改进,即:一旦知道这个文件已存在立即通知product线程。
...全文
653
25
打赏
收藏
关于避免轮询而采用事件驱动得问题
我在设计多线程时经常碰到这样一个问题。例如在经典的product-customer模式中,有时并非我的product线程能控制自己生产的“产品”来供customer消费,而是要向外部系统要数据,这个时候不可避免要用product线程轮询外部系统的状态,直到得到“产品”。例如:轮询某个文件夹下某个文件是否已经存在,不存在就睡眠一段时间继续轮询。显然这样比较低效,请问有什么消息驱动的方式可以改进,即:一旦知道这个文件已存在立即通知product线程。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ghosert
2006-08-23
打赏
举报
回复
问题就在于虚拟机层面和本地操作系统还存在隔阂,我有个想法是,可以找找WINDOWS API里没有实现消息通知机制的API,用JNI封装到JAVA里,这样就可以避免轮询,深入下去是可以做出来的,坏处就是,和操作系统本身绑定了,轮询本身低效,但实现起来容易,而且基本是平台无关的,呵呵,其实就这样算了吧,大家再讨论讨论,我结贴了。
pauliuyou
2006-08-23
打赏
举报
回复
应该是wait加notify吧.
zhmt
2006-08-23
打赏
举报
回复
路过,友情up...
碧海情天-赵亮
2006-08-23
打赏
举报
回复
除了这种"不起眼"的地方,我也想不出更有高度的建议了,因为这样的问题我以前就想过,结论就是无法避免轮询,不管是自己去轮询,还是通过一些机制(它们仍然是要去轮询).
虽然我说得似乎绝对化,但请大家想想.
如果真有能打碎这个断言的高手,也是我一直希望的.在这方面自我感觉也是很缺乏学习的.
JAVA_WEB
2006-08-23
打赏
举报
回复
推荐用observer设计模式!
碧海情天-赵亮
2006-08-23
打赏
举报
回复
我的意思是,如果按你目前这样通过文件操作,你应该知道这里面有多少手续(=多少指令?).
而在合适的地方设置一个标志变量,这能节省很多指令的.
碧海情天-赵亮
2006-08-23
打赏
举报
回复
我的意思是通过文件操作,你应该知道这里面有多少手续(=多少指令?).
而在合适的地方设置一个标志变量,这能节省很多指令的.
轮询,其实你说如何能避免得了???
通过这事件机制那通知机制,可是它们在最底层,其实仍然是使用的轮询,你说是不是?
bigc2000
2006-08-22
打赏
举报
回复
唉原来是这样。我想只能查找了,File.exist()
不过wait(时间),也就是定时查询,每隔多少时间去查询一次,这个时间很难保握住。
至于是不是要用wait,notify,
我觉得可以用BlockingQueue等等其他的新的多线程简单方式实现,比较省事写。查询的事情也可以用timer,好像ScheduledThreadPoolExecutor更好一些。但我只用过timer,呵呵。
今晚打老虎33333333
2006-08-22
打赏
举报
回复
observer不过是在发生一件事情的同时去做另一件事情,问题还是没有解决,你不知道什么时候发生了这件事情。谁通知你,还是自己去检查
------------------------
为什么要自己检查呢?完全可以将这些东西封装在一个object里面通知Observer。
ghosert
2006-08-22
打赏
举报
回复
observer不过是在发生一件事情的同时去做另一件事情,问题还是没有解决,你不知道什么时候发生了这件事情。谁通知你,还是自己去检查
wanguanghai
2006-08-22
打赏
举报
回复
顶
Voxer
2006-08-22
打赏
举报
回复
用observer不行吗?
ghosert
2006-08-22
打赏
举报
回复
楼上,设定标志量和标志数据的依据是什么呢?还不是要知道有无特定文件?
我实践下来,File file = new File(String pathname) 之后,只要轮询file.listFiles(), 一旦有文件就能以这种方式得到,其实本身也没什么低效,低效的是轮询本身, 毕竟每隔一段时间要花CPU的,NOTIFY的方式就OK了,没NOTIFY之前就是WAIT,不占CPU。
ghosert
2006-08-22
打赏
举报
回复
WAIT(时间)和SPLEEP(时间)没啥么差别了。。。唉。。。。
TIMER的实现机制也是WAIT(时间)
问题还是没解决。。。。
为什么要自己检查呢?完全可以将这些东西封装在一个object里面通知Observer
to BeShrek(今晚打老虎): 你能不能想清楚再回答啊。OBJECT通知OBESERVER,那谁通知OBJECT啊?
千里冰封820
2006-08-21
打赏
举报
回复
当然可以,可以用经典的wait(),notify() 方法
如果外部不满足就wait,当外面的做好以后,就可以调用notify方法,这个时候,在wait的线程就被唤醒了,这比轮询的效率当然要高
emin_lee
2006-08-21
打赏
举报
回复
mark!
ghosert
2006-08-21
打赏
举报
回复
up
ghosert
2006-08-21
打赏
举报
回复
TO:bigc2000(公元2005年4月9日)
{某个文件夹下某个文件是否已经存在}创建这个文件的角色是生产者.
如果创建文件的角色是我所控制的,那我只要一个product生产者就OK了,也不需要轮询。例如我可以直接在product里new File()然后notify customer你可以使用了,并且自己wait起来。
问题就在于往往这个new File的动作不是我控制的,例如某人在资源管理器里新建了一个文件。
所以这种情况下是不是只能用轮询。
碧海情天-赵亮
2006-08-21
打赏
举报
回复
没时间,先说一种对楼主目前方式的改进:
原有轮询要查看文件夹下有无特定文件,这本身就效率低.
可以设置标志变量或者标志数据,可以加快轮询效率.
maquan
2006-08-21
打赏
举报
回复
hbwhwang 已经穿齐 5 条三角裤啦?!hehe,恭喜恭喜!
加载更多回复(5)
netty源码分析与架构介绍
一、为什么要学习本门课程...如解决jdk空
轮询
问题
,数组代替set的巧妙应用,hash路由的优化等 4、netty中pipeline编程模式为多数框架的学习和参考的样板 二、本课程的特点
采用
UML和源码相结合的方式,更加直观,更加实用
C#学习笔记(第3期):事件与
事件驱动
事件驱动
指的是这样一种程序模式:【当某种事件发生时,自动触发并执行该事件的响应程序,而不需要一直观测并判断该事件是否发生。】 为什么程序中需要引入
事件驱动
模式? 2.实例:
采用
事件驱动
的好处 来看一个...
事件
轮询
机制 Event Loop、浏览器更新渲染时机、setTimeout VS setInterval
事件
轮询
机制 Event Loop、浏览器更新渲染时机、setTimeout VS setInterval
自定义
事件驱动
系统
自定义
事件驱动
系统 在程序设计里有一种模型叫做“
事件驱动
模型”,这个模型最初是用于异步处理之间的冲突而出现的,后来被用到各种程序中,成为了一种重要的程序设计模型,广为流传。基于
事件驱动
的程序结构 ...
Netty Review - NIO空
轮询
及Netty的解决方案源码分析
在Netty中,通过使用基于
事件驱动
的模型,
避免
了空
轮询
的
问题
。在早期版本的JDK中,Java NIO的实现对于空
轮询
问题
没有进行有效的处理,导致在高并发、高负载的网络应用中,会造成CPU资源的浪费。
Java SE
62,614
社区成员
307,326
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章