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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄连兵 中级黑马   /  2012-6-12 09:20  /  1572 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄连兵 于 2012-6-12 09:57 编辑

毕老师的视频教程多线程中有一个经典例子,使用Lock+Condition来替代Synchronize。
其中的Condition_p 和 Condition_c 是如何跟线程绑定的?使得lock可以把当前线程分成两种情况来管理?
例子中两个生产线程t1,t2,两个消费线程t3 , t4并没有显式地与Condition_p 和 Condition_c绑定,
我们只知道Condition_p结束后会唤醒Condition_c,Condition_c结束后会唤醒Condition_p.

个人的理解是,两类线程通过程序的入口来实现的绑定,Producer的入口是set(),进去后就是Condition_p,而Consumer的入口是out(),进去后就是Condition_c
  1. <p>package com.practise;
  2. import java.util.concurrent.locks.*;
  3. </p><p>
  4. public class Lock {
  5. </p><p> /**
  6.   * @param args
  7.   */
  8. public static void main(String[] args) {
  9.   // TODO Auto-generated method stub</p><p>  Resource res=new Resource();
  10.   Thread pro1=new Thread(new Producer(res));
  11.   Thread pro2=new Thread(new Producer(res));
  12.   
  13.   Thread con1=new Thread(new Consumer(res));
  14.   Thread con2=new Thread(new Consumer(res));
  15.   pro1.start();
  16.   pro2.start();
  17.   con1.start();
  18.   con2.start();
  19.   }
  20. }
  21. </p><p>
  22. class Resource{
  23. private String name;
  24. private int count=1;
  25. private boolean flag=false;

  26. private ReentrantLock lock=new ReentrantLock();
  27. //此处为什么我写成private Lock lock=new ReentrantLock();会报错,这个向上转型有问题么?毕老师的是正常的~!难道又是版本问题?
  28. </p><p>
  29. private Condition condition_p=lock.newCondition();
  30. private Condition condition_c=lock.newCondition();

  31. public void set(String name)throws InterruptedException{
  32.   lock.lock();
  33.   try{
  34.   while(flag)
  35.    condition_p.await();
  36.   this.name=name+"..."+count++;
  37.   System.out.println(Thread.currentThread().toString()+"...producer..."+this.name);
  38.   flag=true;
  39.   condition_c.signal();
  40. }
  41.   finally{
  42.    lock.unlock();
  43.   }
  44. }
  45. public void out()throws InterruptedException{
  46.   lock.lock();
  47.   try{
  48.    while(!flag)
  49.     condition_c.await();
  50.    System.out.println(Thread.currentThread().toString()+"......consumer......"+this.name);
  51.    flag=false;
  52.    condition_p.signal();
  53.   }
  54.   finally{
  55.    lock.unlock();
  56.   }
  57. }
  58. }</p><p>class Producer implements Runnable{
  59. private Resource res;
  60. Producer(Resource res)
  61. {
  62.   this.res=res;
  63. }
  64. public void run(){
  65.   while(true)
  66.    try {
  67.     res.set("商品");
  68.    } catch (InterruptedException e) {
  69.     // TODO Auto-generated catch block
  70.     e.printStackTrace();
  71.    }  
  72. }
  73. }</p><p>class Consumer implements Runnable{
  74. private Resource res;
  75. Consumer(Resource res)
  76. {
  77.   this.res=res;
  78. }
  79. public void run(){
  80.   while(true)
  81.    try {
  82.     res.out();
  83.    } catch (InterruptedException e) {
  84.     // TODO Auto-generated catch block
  85.     e.printStackTrace();
  86.    }  
  87. }
  88. }</p><p> </p>
复制代码

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1

查看全部评分

2 个回复

倒序浏览
多谢版主鼓励,总算长分了呀~!{:soso_e109:}
回复 使用道具 举报
我就这么写的,没问题的,  是不是你没导包??  你看下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马