java 用condition&reentrylock实现生产者消费者
package com.lb; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class test { private ReentrantLock lock; private Condition create = null; private Condition print = null; private volatile String num = ""; private boolean flag = true; public static void main(String[] args) { new test().test2(); } public test() { lock = new ReentrantLock(); create = lock.newCondition(); print = lock.newCondition(); } public void test2() { Thread conThread = new Thread(new consumer()); Thread creThread = new Thread(new productor()); conThread.start(); creThread.start(); } class productor implements Runnable { @Override public void run() { // TODO Auto-generated method stub while (flag) { lock.lock(); if (num.equals("")) { String value = String.valueOf(((int) (Math.random() * 10) % 6) + 1); System.out.println("create value is " + value); num = value; print.signalAll(); lock.unlock(); } else { try { create.await(); lock.unlock(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } class consumer implements Runnable { @Override public void run() { // TODO Auto-generated method stub while (flag) { lock.lock(); if (!num.equals("")) { System.out.println("consumer " + num); num = ""; create.signalAll(); lock.unlock(); } else { try { print.await(); lock.unlock(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }