关于避免轮询而采用事件驱动得问题

ghosert 2006-08-20 09:26:12
我在设计多线程时经常碰到这样一个问题。例如在经典的product-customer模式中,有时并非我的product线程能控制自己生产的“产品”来供customer消费,而是要向外部系统要数据,这个时候不可避免要用product线程轮询外部系统的状态,直到得到“产品”。例如:轮询某个文件夹下某个文件是否已经存在,不存在就睡眠一段时间继续轮询。显然这样比较低效,请问有什么消息驱动的方式可以改进,即:一旦知道这个文件已存在立即通知product线程。
...全文
653 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghosert 2006-08-23
  • 打赏
  • 举报
回复
问题就在于虚拟机层面和本地操作系统还存在隔阂,我有个想法是,可以找找WINDOWS API里没有实现消息通知机制的API,用JNI封装到JAVA里,这样就可以避免轮询,深入下去是可以做出来的,坏处就是,和操作系统本身绑定了,轮询本身低效,但实现起来容易,而且基本是平台无关的,呵呵,其实就这样算了吧,大家再讨论讨论,我结贴了。
pauliuyou 2006-08-23
  • 打赏
  • 举报
回复
应该是wait加notify吧.
zhmt 2006-08-23
  • 打赏
  • 举报
回复
路过,友情up...
  • 打赏
  • 举报
回复
除了这种"不起眼"的地方,我也想不出更有高度的建议了,因为这样的问题我以前就想过,结论就是无法避免轮询,不管是自己去轮询,还是通过一些机制(它们仍然是要去轮询).
虽然我说得似乎绝对化,但请大家想想.
如果真有能打碎这个断言的高手,也是我一直希望的.在这方面自我感觉也是很缺乏学习的.
JAVA_WEB 2006-08-23
  • 打赏
  • 举报
回复
推荐用observer设计模式!
  • 打赏
  • 举报
回复
我的意思是,如果按你目前这样通过文件操作,你应该知道这里面有多少手续(=多少指令?).
而在合适的地方设置一个标志变量,这能节省很多指令的.
  • 打赏
  • 举报
回复
我的意思是通过文件操作,你应该知道这里面有多少手续(=多少指令?).
而在合适的地方设置一个标志变量,这能节省很多指令的.

轮询,其实你说如何能避免得了???
通过这事件机制那通知机制,可是它们在最底层,其实仍然是使用的轮询,你说是不是?
bigc2000 2006-08-22
  • 打赏
  • 举报
回复
唉原来是这样。我想只能查找了,File.exist()
不过wait(时间),也就是定时查询,每隔多少时间去查询一次,这个时间很难保握住。
至于是不是要用wait,notify,
我觉得可以用BlockingQueue等等其他的新的多线程简单方式实现,比较省事写。查询的事情也可以用timer,好像ScheduledThreadPoolExecutor更好一些。但我只用过timer,呵呵。
  • 打赏
  • 举报
回复
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的动作不是我控制的,例如某人在资源管理器里新建了一个文件。
所以这种情况下是不是只能用轮询。
  • 打赏
  • 举报
回复
没时间,先说一种对楼主目前方式的改进:

原有轮询要查看文件夹下有无特定文件,这本身就效率低.
可以设置标志变量或者标志数据,可以加快轮询效率.
maquan 2006-08-21
  • 打赏
  • 举报
回复
hbwhwang 已经穿齐 5 条三角裤啦?!hehe,恭喜恭喜!
加载更多回复(5)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧