设为首页 加入收藏

TOP

JAVA技巧(Java线程间的通信)
2014-11-23 21:26:59 】 浏览:202
Tags:JAVA 技巧 Java 线程 通信

  线程间的通信(生产者-消费者模式)
  有如下情形,线程A向盘子里放桔子(盘子很小,只能容得下一个桔子),放完桔子后,如果其它线程没有来拿桔子,则A下次再放桔子时,留在盘子里的上次那个桔子就被覆盖掉了(现实并非这样),但我们并不希望这个可口的桔子就这样被第二个桔子覆盖掉。我们的理想情况是:线程A每次在盘子里放完一个桔子后,马上通知其它线程来取这个桔子,这时,线程A就暂停放桔子在盘子里,其它线程取走桔子之后,马上通知A桔子已经被取走,这时,A继续放下一个桔子,并通知其它线程来取,这样反复下去(为了不让产生者永久的放,消费者永久地取,可限定生产者一共要放100次桔子)……于是,放一个就取走一个,所有桔子都被成功取走。
  在上述案例子中,线程A与线程B之间是生产者与消费者的关系,线程A生产桔子,把桔子在盘子里,线程B从盘子里拿走桔子,享受美味。而且,为了达到生产一个,拿走一个,这样的一对一的过程,线程A必须告诉线程B:桔子已经放好了,来拿吧,你拿走了,我再放下一个。当线程B拿走后,必须告诉线程A:我把桔子拿走了,你快放下一个吧。线程A和B互相告诉对方的动作,就是线程间的通信。
  取放桔子的整个过程,涉及到了四个对象,分别是生产者(线程A),消费者(线程B),消费的商品(桔子),商店(盘子)。因此,可以把上述过程看作是生产者和消费者在商店里交易桔子。下图描绘了上述整个过程:



  下面的代码实现了本案例:
  class MyTest1{
  public static void main(String[] args){
  Panel pan = new Panel();
  Consumer c = new Consumer(pan);
  Producer p = new Producer(pan, c);
  c.setDaemon(true);/*将消费者设为守护线程,也就是说,当生产者不再生产时,消费者立即主动不再消费*/
  p.start();
  c.start();
  }
  }


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇IE6中ExtJSGrid表头下拉菜单错乱.. 下一篇JAVA技巧:HashMap和Hashtable的遍..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目