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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑枫 中级黑马   /  2012-8-1 16:38  /  1529 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.util.concurrent.locks.*;
  2. class Res
  3. {
  4. private String name;
  5. private int nex = 1;
  6. private boolean fiag = false;

  7. private Lock lock = new ReentrantLock();

  8. private Condition condition_pro = lock.newCondition();
  9. private Condition condition_con = lock.newCondition();


  10. public void set (String name)throws InterruptedException
  11. {
  12. lock.lock(); //加锁
  13. try
  14. {
  15. while (fiag)
  16. condition_pro.await();//set 的等待
  17. this.name = name+" "+nex++;

  18. System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
  19. fiag = true;
  20. condition_con.signal(); //唤醒对方的等待
  21. }
  22. finally
  23. {
  24. lock.unlock(); //释放锁。 这个动作一定执行
  25. }
  26. }

  27. public void out ()throws InterruptedException
  28. {
  29. lock.lock(); //加锁
  30. try
  31. {
  32. while(!fiag);
  33. condition_con.await();
  34. System.out.println(Thread.currentThread().getName()+"... 消费者 .."+this.name);
  35. fiag = false;
  36. condition_pro.signal();
  37. }
  38. finally
  39. {
  40. lock.unlock();//释放锁。 这个动作一定执行
  41. }



  42. }
  43. }

  44. class Producer implements Runnable
  45. {
  46. private Res r;
  47. Producer (Res r)
  48. {
  49. this.r = r;
  50. }
  51. public void run()
  52. {
  53. while (true)
  54. {
  55. try
  56. {
  57. r.set("商品");
  58. }
  59. catch (InterruptedException e)
  60. {
  61. }

  62. }
  63. }
  64. }

  65. class Demo implements Runnable
  66. {
  67. private Res r;
  68. Demo(Res r)
  69. {
  70. this.r = r;
  71. }
  72. public void run()
  73. {
  74. while (true)
  75. {
  76. try
  77. {
  78. r.out();
  79. }
  80. catch (InterruptedException e)
  81. {
  82. }

  83. }
  84. }

  85. }

  86. class ProducerDemo4
  87. {
  88. public static void main (String [] asge)
  89. {
  90. Res r = new Res();

  91. Producer pro = new Producer(r);
  92. Demo de = new Demo(r);

  93. Thread a1 = new Thread(pro);
  94. Thread a2 = new Thread(pro);
  95. Thread a3 = new Thread(de);
  96. Thread a4 = new Thread(de);

  97. a1.start();
  98. a2.start();
  99. a3.start();
  100. a4.start();
  101. }
  102. }

复制代码
我要崩溃了   求高人能看看哪里错了。
运行结果是
Thread-0...生产者.. 商品 1
之后就卡那里了。。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 鼓励一下,一定要细心!

查看全部评分

2 个回复

倒序浏览
class Res
{
private String name;
private int nex = 1;
private boolean fiag = false;

private Lock lock = new ReentrantLock();

private Condition condition_pro = lock.newCondition();
private Condition condition_con = lock.newCondition();


public void set (String name)throws InterruptedException
{
lock.lock(); //加锁
try
{
while (fiag)
        condition_pro.await();//set 的等待
this.name = name+" "+nex++;

System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
fiag = true;
condition_con.signal(); //唤醒对方的等待
}
finally
{
lock.unlock(); //释放锁。 这个动作一定执行
}
}

public void out ()throws InterruptedException
{
lock.lock(); //加锁
try
{
while(!fiag);//问题出在这里,你的while循环后面跟了一个分号。所以默认方法体为空,线程一直在做死循环。分号去掉即可
        condition_con.await();
System.out.println(Thread.currentThread().getName()+"... 消费者 .."+this.name);
fiag = false;
condition_pro.signal();
}
finally
{
lock.unlock();//释放锁。 这个动作一定执行
}



}
}
回复 使用道具 举报
{:soso_e136:}   我晕    {:soso_e179:} 万分感谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马