黑马程序员技术交流社区

标题: 多线程——多生产者-多消费者问题 [打印本页]

作者: 肚小糖    时间: 2015-8-24 15:03
标题: 多线程——多生产者-多消费者问题
  1. import java.util.concurrent.locks.*;
  2. class Resource{
  3.         private String name;
  4.         private int count = 1;
  5.         private boolean flag = false;
  6.         //创建一个锁对象
  7.         Lock lock = new ReentrantLock();
  8.         //通过已有的锁获取该锁上的监视器对象
  9.         Condition con = lock.newCondition();
  10.         public void set(String name){
  11.                 lock.lock();
  12.                 try{
  13.                         while(flag) //重复判断生产者是否生产
  14.                                 try{
  15.                                         con.await();//生产者等待
  16.                                 }catch(InterruptedException e){
  17.                                         e.printStackTrace();
  18.                                 }
  19.                         this.name = name + count;
  20.                         count++;
  21.                         System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
  22.                         flag = true;
  23.                         con.signalAll();//唤醒消费者
  24.                 }finally{
  25.                         lock.unlock();//解锁
  26.                 }
  27.         }
  28.         public void out(){
  29.                 lock.lock();
  30.                 try{
  31.                         while(!flag) //重复判断是否可以消费
  32.                                 try{
  33.                                         con.await();//消费者等待
  34.                                 }catch(InterruptedException e){
  35.                                         e.printStackTrace();
  36.                                 }
  37.                         System.out.println(Thread.currentThread().getName()+"...消费者..."+this.name);
  38.                         flag = false;
  39.                         con.signalAll();//唤醒生产者
  40.                 }finally{
  41.                         lock.unlock();//解锁
  42.                 }
  43.         }
  44. }
  45. //生产者
  46. class Producer implements Runnable{
  47.         private Resource r;
  48.         Producer(Resource r){
  49.                 this.r = r;
  50.         }
  51.         //复写run()
  52.         public void run(){
  53.                 while(true){
  54.                         r.set("Item");
  55.                 }
  56.         }
  57. }
  58. //消费者
  59. class Consumer implements Runnable{
  60.         private Resource r;
  61.         Consumer(Resource r){
  62.                 this.r = r;
  63.         }
  64.         //复写run()
  65.         public void run(){
  66.                 while(true){
  67.                         r.out();
  68.                 }
  69.         }
  70. }

  71. public class ResourceDemo {
  72.         public static void main(String[] args){
  73.                 Resource r  = new Resource();
  74.                 Producer pro = new Producer(r);
  75.                 Consumer con = new Consumer(r);
  76.                 Thread t0 = new Thread(pro); //生产者线程t0
  77.                 Thread t1 = new Thread(pro); //生产者线程t1
  78.                 Thread t2 = new Thread(con); //消费者线程t2
  79.                 Thread t3 = new Thread(con); //消费者线程t3
  80.                 t0.start();
  81.                 t1.start();
  82.                 t2.start();
  83.                 t3.start();
  84.         }
  85. }
复制代码







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2