多线程 等待唤醒机制 生产者消费者 (Lock jdk1.5版)

package com.yc.thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Resource2 {
 private String goods;
 private int num = 0;
 private boolean flag = false;
 private Lock lock = new ReentrantLock();
 final Condition inCondition=lock.newCondition();
 final Condition outCondition=lock.newCondition();
 
 public void in() {
  lock.lock();
  try {
   while (flag)
    inCondition.await();
   if (num % 2 == 0)
    goods = "coal";
   else
    goods = "oil";
   System.out.println(Thread.currentThread().getName() + "生产:" + goods
     + "_" + (++num));
   flag = !flag;
   outCondition.signalAll();
  } catch (InterruptedException e) {
  }finally{
   lock.unlock();
  }
 }
 public synchronized void out() {
  lock.lock();
  try {
   while (!flag)
    outCondition.await();
   System.out.println(Thread.currentThread().getName() + "---------"
     + "消费:" + goods + "_" + num);
   flag = !flag;
   inCondition.signalAll();
  } catch (InterruptedException e) {
  } finally {
   lock.unlock();
  }
 }
 public int getNum() {
  return num;
 }
}
package com.yc.thread;
public class Consumer2 implements Runnable {
 private Resource2 r;
 
 public Consumer2(Resource2 r){
  this.r=r;
 }
 
 public void run(){
  int n=500;//每个消费的线程各消费500次
  while(n-->0){
   r.out();
  }
 }
}
package com.yc.thread;
public class Producer2 implements Runnable {
 private Resource2 r;
 public Producer2(Resource2 r) {
  this.r = r;
 }
 public void run() {
  int n = 500;// 每个生产的线程生产500次
  while (n-- > 0) {
   r.in();
  }
 }
}
package com.yc.thread;
class ProducerConsumer {
 public static void main(String[] args) {
  /*
   * // Resource1 r1=new Resource1(); // // Producer1 p1=new
   * Producer1(r1); // Consumer1 c1=new Consumer1(r1); // // new
   * Thread(p1).start(); // new Thread(c1).start(); // new
   * Thread(p1).start(); // new Thread(c1).start(); // new
   * Thread(p1).start(); // new Thread(c1).start();
   */
  // 或: 不太理解!
  // new Thread(new Producer(r)).start();
  // new Thread(new Consumer(r)).start();
  // new Thread(new Consumer(r)).start();
  // new Thread(new Consumer(r)).start();
  // new Thread(new Consumer(r)).start();
  Resource2 r2 = new Resource2();
  Producer2 p2 = new Producer2(r2);
  Consumer2 c2 = new Consumer2(r2);
  new Thread(p2).start();
  new Thread(p2).start();
  new Thread(c2).start();
  new Thread(c2).start();
  new Thread(c2).start();
  new Thread(c2).start();
 }
}

你可能感兴趣的:(java,多线程,生产者消费者,等待唤醒机制)