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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张丽 中级黑马   /  2012-10-6 19:54  /  1669 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package zhangli1;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockDemo {
/**
  * 生产者消费者实例的1.5以后版本中用Lock来实现。
  * @param args
  */
public static void main(String[] args) {
  // TODO Auto-generated method stub
        Resource r=new Resource();
        Producer pro=new Producer(r);
        Consumer con=new Consumer(r);
        Thread t1=new Thread(pro);
        Thread t2=new Thread(pro);
        Thread t3=new Thread(con);
        Thread t4=new Thread(con);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        
}
}
class Resource{
private String name;
private int count=1;
private static boolean flag=false;
Lock lock=new ReentrantLock();//创建一个锁对象
private Condition producer_con=lock.newCondition();//创建锁上的监视器对象(生产者)
private Condition consumer_con=lock.newCondition();//创建锁上的监视器对象(消费者)

public void set(String name){
  lock.lock();
  try{
   while(flag)
    try {
     producer_con.await();
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
  this.name=name+count;
  System.out.println(Thread.currentThread().getName()+".生产者.."+this.name);
  count++;
  consumer_con.signal();
  }finally{
   lock.unlock();
  }
}
public void out(){
  lock.lock();
  try{
   while(!flag)
    try {
     consumer_con.await();
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
  System.out.println(Thread.currentThread().getName()+"....消费者....."+name);
  producer_con.signal();
  }finally{
   lock.unlock();
  }
}
}
class Producer implements Runnable{
Resource r;
Producer(Resource r){
  this.r=r;
}
public void run(){
while(true){
  r.set("生日蛋糕");
}
}
}
class Consumer implements Runnable{
Resource r;
Consumer(Resource r){
  this.r=r;
}
public void run(){
while(true){
  r.out();
}
}
}
运行结果如下,问下为什么只出现了两个线程,而没有Thread-2和Thread-3,而且为什么不是生产一个,消费一个的?
Thread-0.生产者..生日蛋糕79377
Thread-0.生产者..生日蛋糕79378
Thread-0.生产者..生日蛋糕79379
Thread-0.生产者..生日蛋糕79380
Thread-0.生产者..生日蛋糕79381
Thread-0.生产者..生日蛋糕79382
Thread-0.生产者..生日蛋糕79383
Thread-0.生产者..生日蛋糕79384
Thread-0.生产者..生日蛋糕79385
Thread-0.生产者..生日蛋糕79386
Thread-0.生产者..生日蛋糕79387
Thread-0.生产者..生日蛋糕79388
Thread-0.生产者..生日蛋糕79389
Thread-0.生产者..生日蛋糕79390
Thread-0.生产者..生日蛋糕79391
Thread-0.生产者..生日蛋糕79392
Thread-1.生产者..生日蛋糕79393
Thread-1.生产者..生日蛋糕79394
Thread-1.生产者..生日蛋糕79395
Thread-1.生产者..生日蛋糕79396
Thread-1.生产者..生日蛋糕79397
Thread-1.生产者..生日蛋糕79398
Thread-1.生产者..生日蛋糕79399
Thread-1.生产者..生日蛋糕79400
Thread-1.生产者..生日蛋糕79401
Thread-1.生产者..生日蛋糕79402
Thread-1.生产者..生日蛋糕79403
Thread-1.生产者..生日蛋糕79404
Thread-1.生产者..生日蛋糕79405
Thread-1.生产者..生日蛋糕79406
Thread-1.生产者..生日蛋糕79407
Thread-1.生产者..生日蛋糕79408
Thread-1.生产者..生日蛋糕79409
Thread-1.生产者..生日蛋糕79410
Thread-1.生产者..生日蛋糕79411
Thread-1.生产者..生日蛋糕79412
Thread-1.生产者..生日蛋糕79413
Thread-1.生产者..生日蛋糕79414
Thread-1.生产者..生日蛋糕79415
Thread-1.生产者..生日蛋糕79416
Thread-1.生产者..生日蛋糕79417
Thread-1.生产者..生日蛋糕79418
Thread-1.生产者..生日蛋糕79419
Thread-1.生产者..生日蛋糕79420
Thread-1.生产者..生日蛋糕79421
Thread-1.生产者..生日蛋糕79422
Thread-1.生产者..生日蛋糕79423
Thread-1.生产者..生日蛋糕79424
Thread-1.生产者..生日蛋糕79425
Thread-1.生产者..生日蛋糕79426
Thread-1.生产者..生日蛋糕79427
Thread-1.生产者..生日蛋糕79428
Thread-1.生产者..生日蛋糕79429
Thread-1.生产者..生日蛋糕79430
Thread-1.生产者..生日蛋糕79431

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
这个程序我没细看 但是建议楼主多运行几次 ,或者 你多开点消耗CPU的程序,这样有可能会看到别的线程了 呵呵

因为这些线程在抢夺CPU资源的时候是不确定的哦 不一定谁先抢到,有可能1线程 和主线程 呛到了 就全执行完了 没等其他线程运行呢,,就会产生楼主你看到的结果呵呵
回复 使用道具 举报
  1. import java.util.concurrent.locks.Condition;
  2. import java.util.concurrent.locks.Lock;
  3. import java.util.concurrent.locks.ReentrantLock;
  4. public class LockDemo {
  5. /**
  6.    * 生产者消费者实例的1.5以后版本中用Lock来实现。
  7.    * @param args
  8.    */
  9. public static void main(String[] args) {
  10.    // TODO Auto-generated method stub
  11.          Resource r=new Resource();
  12.          Producer pro=new Producer(r);
  13.          Consumer con=new Consumer(r);
  14.          Thread t1=new Thread(pro);
  15.          Thread t2=new Thread(pro);
  16.          Thread t3=new Thread(con);
  17.          Thread t4=new Thread(con);
  18.          t1.start();
  19.          t2.start();
  20.          t3.start();
  21.          t4.start();
  22.          
  23. }
  24. }
  25. class Resource
  26. {
  27.         private String name;
  28.         private int count = 1;
  29.         private boolean flag = false;
  30.                         //  t1    t2
  31.         private Lock lock = new ReentrantLock();

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



  34.         public  void set(String name)throws InterruptedException
  35.         {
  36.                 lock.lock();
  37.                 try
  38.                 {
  39.                         while(flag)
  40.                                 condition_pro.await();//t1,t2
  41.                         this.name = name+"--"+count++;

  42.                         System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
  43.                         flag = true;
  44.                         condition_con.signal();
  45.                 }
  46.                 finally
  47.                 {
  48.                         lock.unlock();//释放锁的动作一定要执行。
  49.                 }
  50.         }


  51.         //  t3   t4  
  52.         public  void out()throws InterruptedException
  53.         {
  54.                 lock.lock();
  55.                 try
  56.                 {
  57.                         while(!flag)
  58.                                 condition_con.await();
  59.                         System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);
  60.                         flag = false;
  61.                         condition_pro.signal();
  62.                 }
  63.                 finally
  64.                 {
  65.                         lock.unlock();
  66.                 }
  67.                
  68.         }
  69. }
  70. class Producer implements Runnable
  71. {
  72.         private Resource res;

  73.         Producer(Resource res)
  74.         {
  75.                 this.res = res;
  76.         }
  77.         public void run()
  78.         {
  79.                 while(true)
  80.                 {
  81.                         try
  82.                         {
  83.                                 res.set("生日蛋糕");
  84.                         }
  85.                         catch (InterruptedException e)
  86.                         {
  87.                         }
  88.                        
  89.                 }
  90.         }
  91. }

  92. class Consumer implements Runnable
  93. {
  94.         private Resource res;

  95.         Consumer(Resource res)
  96.         {
  97.                 this.res = res;
  98.         }
  99.         public void run()
  100.         {
  101.                 while(true)
  102.                 {
  103.                         try
  104.                         {
  105.                                 res.out();
  106.                         }
  107.                         catch (InterruptedException e)
  108.                         {
  109.                         }
  110.                 }
  111.         }
  112. }
复制代码
这样就能正常运行了
Thread-2...消费者.........生日蛋糕--2873
Thread-0...生产者..生日蛋糕--2874
Thread-3...消费者.........生日蛋糕--2874
Thread-1...生产者..生日蛋糕--2875
Thread-2...消费者.........生日蛋糕--2875
Thread-0...生产者..生日蛋糕--2876
Thread-3...消费者.........生日蛋糕--2876
Thread-1...生产者..生日蛋糕--2877
Thread-2...消费者.........生日蛋糕--2877
Thread-0...生产者..生日蛋糕--2878
Thread-3...消费者.........生日蛋糕--2878
Thread-1...生产者..生日蛋糕--2879
Thread-2...消费者.........生日蛋糕--2879
Thread-0...生产者..生日蛋糕--2880
Thread-3...消费者.........生日蛋糕--2880
Thread-1...生产者..生日蛋糕--2881
Thread-2...消费者.........生日蛋糕--2881
Thread-0...生产者..生日蛋糕--2882
Thread-3...消费者.........生日蛋糕--2882
Thread-1...生产者..生日蛋糕--2883
Thread-2...消费者.........生日蛋糕--2883
Thread-0...生产者..生日蛋糕--2884
Thread-3...消费者.........生日蛋糕--2884
Thread-1...生产者..生日蛋糕--2885
Thread-2...消费者.........生日蛋糕--2885
Thread-0...生产者..生日蛋糕--2886
Thread-3...消费者.........生日蛋糕--2886
Thread-1...生产者..生日蛋糕--2887
Thread-2...消费者.........生日蛋糕--2887
Thread-0...生产者..生日蛋糕--2888
Thread-3...消费者.........生日蛋糕--2888
Thread-1...生产者..生日蛋糕--2889
Thread-2...消费者.........生日蛋糕--2889
Thread-0...生产者..生日蛋糕--2890
Thread-3...消费者.........生日蛋糕--2890
Thread-1...生产者..生日蛋糕--2891
Thread-2...消费者.........生日蛋糕--2891
Thread-0...生产者..生日蛋糕--2892
Thread-3...消费者.........生日蛋糕--2892
Thread-1...生产者..生日蛋糕--2893
Thread-2...消费者.........生日蛋糕--2893
Thread-0...生产者..生日蛋糕--2894
Thread-3...消费者.........生日蛋糕--2894
Thread-1...生产者..生日蛋糕--2895
Thread-2...消费者.........生日蛋糕--2895
Thread-0...生产者..生日蛋糕--2896
Thread-3...消费者.........生日蛋糕--2896
Thread-1...生产者..生日蛋糕--2897
Thread-2...消费者.........生日蛋糕--2897
Thread-0...生产者..生日蛋糕--2898
Thread-3...消费者.........生日蛋糕--2898
Thread-1...生产者..生日蛋糕--2899
Thread-2...消费者.........生日蛋糕--2899
Thread-0...生产者..生日蛋糕--2900
Thread-3...消费者.........生日蛋糕--2900
Thread-1...生产者..生日蛋糕--2901
Thread-2...消费者.........生日蛋糕--2901
Thread-0...生产者..生日蛋糕--2902
Thread-3...消费者.........生日蛋糕--2902
Thread-1...生产者..生日蛋糕--2903
Thread-2...消费者.........生日蛋糕--2903
Thread-0...生产者..生日蛋糕--2904
Thread-3...消费者.........生日蛋糕--2904
Thread-1...生产者..生日蛋糕--2905
Thread-2...消费者.........生日蛋糕--2905
Thread-0...生产者..生日蛋糕--2906
Thread-3...消费者.........生日蛋糕--2906
Thread-1...生产者..生日蛋糕--2907
Thread-2...消费者.........生日蛋糕--2907
Thread-0...生产者..生日蛋糕--2908
Thread-3...消费者.........生日蛋糕--2908
Thread-1...生产者..生日蛋糕--2909
Thread-2...消费者.........生日蛋糕--2909
Thread-0...生产者..生日蛋糕--2910
Thread-3...消费者.........生日蛋糕--2910
Thread-1...生产者..生日蛋糕--2911
Thread-2...消费者.........生日蛋糕--2911
Thread-0...生产者..生日蛋糕--2912
Thread-3...消费者.........生日蛋糕--2912
Thread-1...生产者..生日蛋糕--2913
Thread-2...消费者.........生日蛋糕--2913
Thread-0...生产者..生日蛋糕--2914
Thread-3...消费者.........生日蛋糕--2914
Thread-1...生产者..生日蛋糕--2915
Thread-2...消费者.........生日蛋糕--2915
Thread-0...生产者..生日蛋糕--2916
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马