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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jxlovqqvo 中级黑马   /  2014-12-18 19:53  /  1335 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这里系统是怎么知道c1为消费者c2为生产者的,我并没有看到Condition 和线程之间的联系,求解答
private Lock lock = new ReentrantLock();
Condition c1 = lock.newCondition();
Condition c2 = lock.newCondition();

  1. package heima;


  2. import java.io.PrintStream;
  3. import java.util.concurrent.locks.Condition;
  4. import java.util.concurrent.locks.Lock;
  5. import java.util.concurrent.locks.ReentrantLock;

  6. public class IntputOutputDome2 {

  7.         /**
  8.          * @param args
  9.          */
  10.         public static void main(String[] args) {
  11.                
  12.                 Res2 r = new Res2();
  13.                 Thread t1 = new Thread(new Input2(r));
  14.                 Thread t2 = new Thread(new Input2(r));
  15.                 Thread t3 = new Thread(new Output2(r));
  16.                 Thread t4 = new Thread(new Output2(r));
  17.                
  18.                 t1.start();
  19.                 t2.start();
  20.                 t3.start();
  21.                 t4.start();
  22.         }

  23. }

  24. class Res2{
  25.         private String name;
  26.         private String sex;
  27.         private boolean b = false;
  28.         private Lock lock = new ReentrantLock();
  29.         Condition c1 = lock.newCondition();
  30.         Condition c2 = lock.newCondition();
  31.         PrintStream out = null;
  32.         public void set(String name,String sex){
  33.                
  34.                 System.out.println("当前状态:"+b);
  35.                 lock.lock();//上锁
  36.                 try {
  37.                        
  38.                         while(b){
  39.                                
  40.                                 c2.await();
  41.                                 System.out.println("生产:"+Thread.currentThread().getName()+"进入等待");
  42.                         }
  43.                         this.name=name;
  44.                         this.sex=sex;
  45.                         System.out.println(Thread.currentThread().getName()+"......生产......"+name+"----"+sex);
  46.                         b = true;
  47.                         c1.signal();//唤醒其他线程
  48.                 } catch (Exception e) {
  49.                        
  50.                 }
  51.                 finally{
  52.                         lock.unlock();//解锁
  53.                 }
  54.                
  55.         }
  56.        
  57.         public void out(){
  58.                
  59.                 System.out.println("out当前状态:"+b);
  60.                 lock.lock();
  61.                 try {
  62.                         while(!b){
  63.                                 c1.await();
  64.                                 System.out.println(Thread.currentThread().getName()+"进入等待");
  65.                         }
  66.                         System.out.println(Thread.currentThread().getName()+"......消费................."+name +"----"+sex);
  67.                         b = false;
  68.                         c2.signal();
  69.                 } catch (InterruptedException e) {
  70.                         // TODO Auto-generated catch block
  71.                         e.printStackTrace();
  72.                 }
  73.                
  74.                 finally{
  75.                         lock.unlock();
  76.                        
  77.                 }
  78.         }
  79. }

  80. class Input2 implements Runnable{

  81.        
  82.         Res2 r;
  83.         public Input2(Res2 r){
  84.                 this.r=r;
  85.         }
  86.         public void run() {
  87.                 int x = 0;
  88.                 while(true){
  89.                         if(x==0){
  90.                                 r.set("张三", "男");
  91.                         }
  92.                         else{
  93.                                
  94.                                 r.set("李四", "女");
  95.                         }
  96.                         x = (x+1)%2;
  97.                 }
  98.                
  99.         }
  100.        
  101.        
  102.        
  103. }

  104. class Output2 implements Runnable{

  105.         Res2 r;
  106.         public Output2(Res2 r){
  107.                 this.r=r;
  108.         }
  109.         public void run() {
  110.                
  111.                 while(true){
  112.                        
  113.                         r.out();
  114.                        
  115.                 }
  116.                
  117.         }
  118.        
  119.        
  120.        
  121. }



复制代码

4 个回复

倒序浏览
Condition对c1、c2和生产者、消费者线程没有什么必然的联系。从程序的运行过程来看,当每个生产者运行通过,就唤醒进入睡眠的消费者线程。当每个消费者运行通过,就唤醒进入睡眠的生产者线程。这及防治了所有线程进入睡眠,又可以唤醒在程序运行过程中,想要唤醒的线程!
回复 使用道具 举报
zhaozhao 发表于 2014-12-18 22:20
Condition对c1、c2和生产者、消费者线程没有什么必然的联系。从程序的运行过程来看,当每个生产者运行通过 ...
当每个生产者运行通过
什么意思?我把c1,c2对换一下,但是不影响结果,就是这里没明白,程序怎么判断出c1和c2的是属于消费者和生产者的
回复 使用道具 举报
可以理解为一个标记,线程1执行c1.await()时,就好像给线程1挂了个c1的标签,同时进入冻结状态,当其他线程执行c1.signal()时,就唤醒了线程1。这样就可以实现有针对性的唤醒,而不是像notifyAll()那样必须唤醒全部。
回复 使用道具 举报
李天富 发表于 2014-12-18 23:24
可以理解为一个标记,线程1执行c1.await()时,就好像给线程1挂了个c1的标签,同时进入冻结状态,当其他线程 ...

我之前也这么想过,就是不知道对不对
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马