首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

java多线程总结六:经典生产者消费者有关问题实现

2012-08-24 
java多线程总结六:经典生产者消费者问题实现这是个线程同步的经典例子,源代码如下:?view plaincopy to cli

java多线程总结六:经典生产者消费者问题实现

这是个线程同步的经典例子,源代码如下:

?

view plaincopy to clipboardprint?
  1. <span?style="font-size:16px;">package?demo.thread;????
  2. /**??*经典生产者与消费者问题:生产者不断的往仓库中存放产品,消费者从仓库中消费产品。?
  3. ?*其中生产者和消费者都可以有若干个。仓库容量有限,库满时不能存放,库空时不能取产品???*/??
  4. ??public?class?ProducersAndConsumers?{??
  5. ????public?static?void?main(String[]?args)?{??????????Storage?storage?=?new?Storage();??
  6. ????????Thread?consumer?=?new?Thread(new?Consumer(storage));??????????consumer.setName("消费者");??
  7. ????????Thread?producer?=?new?Thread(new?Producer(storage));??????????producer.setName("生产者");??
  8. ????????consumer.start();??????????producer.start();??
  9. ????}??}??
  10. ??/**?
  11. ?*?消费者??*/??
  12. class?Consumer?implements?Runnable?{??????private?Storage?storage;??
  13. ??????public?Consumer(Storage?storage)?{??
  14. ????????this.storage?=?storage;??????}??
  15. ??????@Override??
  16. ????public?void?run()?{??????????storage.pop();??
  17. ????}??}??
  18. ??/**?
  19. ?*?生产者??*/??
  20. class?Producer?implements?Runnable?{??????private?Storage?storage;??
  21. ??????public?Producer(Storage?storage)?{??
  22. ????????this.storage?=?storage;??????}??
  23. ??????@Override??
  24. ????public?void?run()?{??????????Product?product?=?new?Product("090505105",?"电话");??
  25. ????????storage.push(product);??????}??
  26. ??}??
  27. ??/**?
  28. ?*?产品类??*/??
  29. class?Product?{??????private?String?id;//?产品id ??
  30. ????private?String?name;//?产品名称 ????
  31. ????public?Product(String?id,?String?name)?{??????????this.id?=?id;??
  32. ????????this.name?=?name;??????}??
  33. ??????@Override??
  34. ????public?String?toString()?{??????????return?"(产品ID:"?+?id?+?"?产品名称:"?+?name?+?")";??
  35. ????}????
  36. ????public?String?getId()?{??????????return?id;??
  37. ????}????
  38. ????public?void?setId(String?id)?{??????????this.id?=?id;??
  39. ????}????
  40. ????public?String?getName()?{??????????return?name;??
  41. ????}????
  42. ????public?void?setName(String?name)?{??????????this.name?=?name;??
  43. ????}????
  44. }????
  45. /**??*仓库?
  46. ?*/??class?Storage?{??
  47. ????//?仓库容量为10 ??????private?Product[]?products?=?new?Product[10];??
  48. ????private?int?top?=?0;????
  49. ????//?生产者往仓库中放入产品 ??????public?synchronized?void?push(Product?product)?{??
  50. ????????while?(top?==?products.length)?{??????????????try?{??
  51. ????????????????wait();//仓库已满,等待 ??????????????}?catch?(InterruptedException?e)?{??
  52. ????????????????//?TODO?Auto-generated?catch?block ??????????????????e.printStackTrace();??
  53. ????????????}??????????}??
  54. ????????//把产品放入仓库 ??????????products[top++]?=?product;??
  55. ????????System.out.println(Thread.currentThread().getName()?+?"?生产了产品"??????????????????+?product);??
  56. ????????notifyAll();//唤醒等待线程 ????
  57. ????}????
  58. ????//?消费者从仓库中取出产品 ??????public?synchronized?Product?pop()?{??
  59. ????????while?(top?==?0)?{??????????????try?{??
  60. ????????????????wait();//仓库空,等待 ??????????????}?catch?(InterruptedException?e)?{??
  61. ????????????????//?TODO?Auto-generated?catch?block ??????????????????e.printStackTrace();??
  62. ????????????}????
  63. ????????}????
  64. ????????//从仓库中取产品 ??????????--top;??
  65. ????????Product?p?=?new?Product(products[top].getId(),?products[top].getName());??????????products[top]?=?null;??
  66. ????????System.out.println(Thread.currentThread().getName()?+?"?消费了产品"?+?p);??????????notifyAll();//唤醒等待线程 ??
  67. ????????return?p;??????}??
  68. }??</span>??


?

?

运行结果:

生产者 生产了产品(产品ID:010435111 产品名称:电话)
消费者 消费了产品(产品ID:010435111 产品名称:电话)

热点排行