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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package day1;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LockDemo {

        public static void main(String[] args) {
               
                   Lockc  ck = new Lockc();
                   producer p = new producer (ck);
                   consumer c= new consumer(ck);
                  
                   Thread t1  = new Thread(p);
                   Thread t2 =  new Thread(p);
                   Thread t3 = new Thread(c);
                   Thread t4 = new Thread(c);
                  
                   t1.start();
                   t2.start();
                   t3.start();
                   t4.start();
        }
       
}
class Lockc{
       
        private String name;
        public int cuu=1;
        private boolean o = false;
       
        Lock  kk =  new ReentrantLock();
        Condition  ll_1 = kk.newCondition();
        Condition  ll_2 = kk.newCondition();
       
        public void set(String name) throws InterruptedException{
                   kk.lock();
                  
                       while(o)
                          
                               try {
                                     ll_1.await();     //t1  t2
                                     this.name=name+"....."+cuu++;
                                               
                                 System.out.println("生产者...................."+this.name+"..........");
                                 o=true;
                                ll_2.signal();
                        }finally{
                               
                                 kk.unlock();
                        }                  
        }
        public  void out() throws InterruptedException{
                  
                  kk.lock();
                  
                       while(!o)
                        try {   
                     
                                 ll_2.await();   //t3 t4
                                  System.out.println("消费者"+"...........");
                                 o = false;
                                 ll_1.signal();       
                        } finally{               
                                 kk.unlock();
                        }
        }
}

class producer implements Runnable{
        private Lockc lo;
        producer (Lockc lo){
                this.lo = lo;
        }

        @Override
        public void run() {
                  
                while(true){
                        // if(lo.cuu>0)
                         try {
                                lo.set("++商品++");
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }       
        }
}
class consumer implements Runnable{
     private Lockc lo;
     consumer(Lockc lo){
              this.lo = lo;
     }
        @Override
        public void run() {
               
                while(true){
                         try {
                                lo.out();
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
        }

}


为什么while(o)在try外面,能启动线程,而不执行代码,
当我把whiile(o)拿到try{}里面, 如: try{
   while(o)
}
就能正常的运行代码,  真分不清这两种有什么不同,希望高手来解答。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 鼓励一下

查看全部评分

4 个回复

倒序浏览
首先while(o)ll_await();就相当于while(o){ll_await();}
我觉得你是没有把这一点想清楚吧;
因为try-catch是一个语句块,就好像一个{}这样;在外面的时候,她就相当与是while(o){ll_await();   ...} 单纯放里面是只会执行ll_await();
而在里面的时候你如果加上{}我觉得效果一样;不知道你加上了没有?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
梁小波 发表于 2012-6-11 22:18
首先while(o)ll_await();就相当于while(o){ll_await();}
我觉得你是没有把这一点想清楚吧;
因为try-catch ...

放里面为什么就不执行,while循环了,为什么只执行ll_await();  我里面明明有while()的
回复 使用道具 举报
sunhaodi 发表于 2012-6-13 17:34
放里面为什么就不执行,while循环了,为什么只执行ll_await();  我里面明明有while()的 ...

我不知道你是否是这样写的
  1.      try { while(o)
  2.                                      ll_1.await();   
  3.                                      this.name=name+"....."+cuu++;
  4.                                                 
  5.                                  System.out.println("生产者...................."+this.name+"..........");
  6.                                  o=true;
  7.                                 ll_2.signal();
复制代码
这样的话只会执行 ll_1.await();  
你如果是不明白这儿,回复我;
如果你的问题不是这儿;
并且你也明白while(o)ll_await();就相当于while(o){ll_await();}
而不是
  1. while(o){
  2.                                ll_1.await();   
  3.                                      this.name=name+"....."+cuu++;
  4.                                                 
  5.                                  System.out.println("生产者...................."+this.name+"..........");
  6.                                  o=true;
  7.                                 ll_2.signal();}
复制代码
也同样回复我,可以加我qq我们具体讨论一下,好吗?
回复 使用道具 举报
while(o){
                           try {
                                  11_1.await();
                               this.name=name+"....."+cuu++;
                                                
                                 System.out.println("生产者...................."+this.name+"..........");
                                 o=true;
                 }
                                   
                                ll_2.signal();}


我这样写的。。。。 就不执行里面的

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马