A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 熊永标 中级黑马   /  2012-12-26 13:16  /  1318 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程多消费的线程处理使用java.concurrent.locks包下的类实现。其代码如下:
  1. import java.util.concurrent.locks.*;
  2. class ThreadLockDemo1
  3. {
  4. public static void main(String[] args)
  5. {
  6. Resources r=new Resources();
  7. Input in=new Input(r);
  8. Output out=new Output(r);
  9. Thread t1=new Thread(in);
  10. Thread t2=new Thread(in);
  11. Thread t3=new Thread(out);
  12. Thread t4=new Thread(out);
  13. t1.start();
  14. t2.start();
  15. t3.start();
  16. t4.start();
  17. }
  18. }
  19. class Resources
  20. {
  21. String[] res=new String[10];
  22. int input_index,output_index,count;
  23. boolean flag=false;
  24. Lock lock=new ReentrantLock();
  25. Condition input_Cos=lock.newCondition();
  26. Condition output_Cos=lock.newCondition();
  27. public void set(String name)
  28. {
  29. lock.lock();
  30. try{

  31. while(count==res.length)
  32. input_Cos.await();
  33. res[input_index++]=name;
  34. System.out.println(Thread.currentThread().getName()+"生产"+res[input_index-1]);
  35. ++count;
  36. if(input_index==res.length-1)
  37. input_index=0;
  38. output_Cos.signal();
  39. }
  40. catch(InterruptedException e)
  41. {
  42. System.out.println(e);
  43. }
  44. finally
  45. {
  46. lock.unlock();
  47. }
  48. }
  49. public void get()
  50. {
  51. lock.lock();
  52. try{

  53. while(count==0)
  54. output_Cos.await();
  55. System.out.println(Thread.currentThread().getName()+res[output_index++]);
  56. --count;
  57. if(output_index==res.length-1)
  58. output_index=0;
  59. input_Cos.signal();
  60. }
  61. catch(InterruptedException e)
  62. {
  63. System.out.println(e);
  64. }
  65. finally
  66. {
  67. lock.unlock();
  68. }
  69. }
  70. }
  71. class Input implements Runnable
  72. {
  73. Resources r=null;
  74. public Input(Resources r)
  75. {
  76. this.r=r;
  77. }
  78. public void run()
  79. {
  80. int i=0;
  81. while(true)
  82. {
  83. r.set("第"+i+"面包");
  84. i++;
  85. }
  86. }
  87. }
  88. class Output implements Runnable
  89. {
  90. Resources r=null;
  91. public Output(Resources r)
  92. {
  93. this.r=r;
  94. }
  95. public void run()
  96. {
  97. while(true)
  98. {
  99. r.get();
  100. }
  101. }
  102. }
复制代码
用这个包的好处在于一个锁里可以有多对的监视器,可以唤星对方的线程。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马