首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

java线程:三种方式实现生产者消费者有关问题_2

2012-11-19 
java线程:三种方式实现生产者消费者问题_2?分类:?java_线程2012-07-03 14:31?37人阅读?评论(0)?收藏?举报

java线程:三种方式实现生产者消费者问题_2

?

分类:?java_线程2012-07-03 14:31?37人阅读?评论(0)?收藏?举报

上一种方式是采用synchronized关键字实现生产者消费者的问题,那是传统的做法,现在采用jdk1.5语法的新增的并发机制实现,以下是仓库类的具体代码实现(生产者类、消费者类类均不变,请参考上一篇文章:《三种方式实现生产者消费者_1》)。

?

[java]?view plaincopy
  1. <span?style="font-family:Arial;">??
  2. /**?
  3. ?*?仓库:?
  4. ?*?先生产的先消费:使用队列的方式实现?
  5. ?*/??
  6. public?class?Storage?{??
  7. ??????
  8. ????public?static?final?int?MAX_SIZE?=?100;?//?仓库的最大货存??
  9. ????//?容器,为了使用方便,没有面向接口编程,使用LinkedList作为实现类??
  10. ????private?LinkedList<Object>?container?=?new?LinkedList<Object>();??
  11. ??????
  12. ????private?Lock?lock?=?new?ReentrantLock();?//?互斥锁,相当于synchronized??
  13. ????private?Condition?getCondition?=?lock.newCondition();??
  14. ????private?Condition?putCondition?=?lock.newCondition();??
  15. ??????
  16. ????//?往仓库中存放一个产品:??
  17. ????public?void?put(){??
  18. ????????lock.lock();??
  19. ????????try?{??
  20. ????????????while(container.size()?==?MAX_SIZE){??
  21. ????????????????putCondition.await();//?生产者等待,并让消费者唤醒??
  22. ????????????}??
  23. ????????????sop("put()等待结束,仓库现有数量为"+?container.size()?+",?开始生产");??
  24. ??????????????
  25. ????????????/*?
  26. ?????????????*?试想一下:如果换成这种做法会有什么弊端:?
  27. ?????????????*?int?size?=?storage.size();?
  28. ?????????????*?sop("put()等待结束,仓库现有数量为"+?size?+",?开始生产");?
  29. ?????????????*?while(size?==?MAX_SIZE){?
  30. ?????????????*??????putCondition.await();?
  31. ?????????????*?}?
  32. ?????????????*?...?
  33. ?????????????*/??
  34. ??????????????
  35. ????????????container.addLast(new?Object());??
  36. ??????????????
  37. ????????????//通知消费者消费??
  38. ????????????getCondition.signal();??
  39. ??????????????
  40. ????????}?catch(Exception?e){??
  41. ????????????throw?new?RuntimeException(e);??
  42. ????????}?finally?{??
  43. ????????????lock.unlock();?//?释放资源??
  44. ????????}??
  45. ????}??
  46. ??????
  47. ????//?从仓库中取出一个产品:??
  48. ????public?void?get(){??
  49. ????????lock.lock();??
  50. ????????try?{??
  51. ????????????while(container.size()?==?0){??
  52. ????????????????//?消费者等待,并让生产者唤醒??
  53. ????????????????getCondition.await();??
  54. ????????????}??
  55. ????????????sop("get()等待结束,仓库现有数量为"+?container.size()?+",?开始消费");??
  56. ????????????Object?obj?=?container.removeLast();??
  57. ????????????//?通知生产者生产??
  58. ????????????putCondition.signal();??
  59. ????????????Thread.sleep(1000);??
  60. ????????}?catch(Exception?e){??
  61. ????????????throw?new?RuntimeException(e);??
  62. ????????}?finally?{??
  63. ????????????lock.unlock();??
  64. ????????}??
  65. ????}??
  66. ??????
  67. ????private?static?void?sop(Object?obj){??
  68. ????????System.out.println(obj);??
  69. ????}??
  70. }??
  71. ??
  72. </span>??
以下是测试代码:[java]?view plaincopy
  1. <span?style="font-family:Arial;">public?class?Test?{??
  2. ??????
  3. ????public?static?void?main(String[]?args)?{??
  4. ????????Storage?storage?=?new?Storage();??
  5. ??????????
  6. ????????Consumer?con?=?new?Consumer(storage);??
  7. ????????Producer?pro?=?new?Producer(storage);??
  8. ??????????
  9. ????????new?Thread(pro).start();??
  10. ????????new?Thread(pro).start();??
  11. //??????new?Thread(pro).start();??
  12. //??????new?Thread(pro).start();??
  13. ??????????
  14. ??????????
  15. //??????new?Thread(con).start();??
  16. ????????new?Thread(con).start();??
  17. ????????new?Thread(con).start();??
  18. ????????new?Thread(con).start();??
  19. ????????new?Thread(con).start();??
  20. ????}??
  21. }??
  22. </span>??

测试结果:

get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
put()等待结束,仓库现有数量为1, 开始生产
get()等待结束,仓库现有数量为2, 开始消费
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
put()等待结束,仓库现有数量为1, 开始生产
get()等待结束,仓库现有数量为2, 开始消费
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
put()等待结束,仓库现有数量为1, 开始生产
get()等待结束,仓库现有数量为2, 开始消费
put()等待结束,仓库现有数量为1, 开始生产
get()等待结束,仓库现有数量为2, 开始消费
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
get()等待结束,仓库现有数量为1, 开始消费

热点排行