多线程--生产者消费者--简单例子
package com.lm.multest; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class Resource { private int num; private String name; private boolean flag = false; Lock lock = new ReentrantLock(); Condition notFull = lock.newCondition(); Condition notEmpty = lock.newCondition(); public void set(String n) { lock.lock(); try { while (flag) notFull.await(); this.name = n + num++; System.out.println(Thread.currentThread().getName() + "..生产..." + name); flag = true; notEmpty.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void out() { lock.lock(); try { while (!flag) notEmpty.await(); System.out.println(Thread.currentThread().getName() + "..消费.." + name); flag = false; notFull.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } class Producer implements Runnable { private Resource res; Producer(Resource res) { this.res = res; } @Override public void run() { while (true) res.set("商品"); } } class Consumer implements Runnable { private Resource res; Consumer(Resource res) { this.res = res; } public void run() { while (true) res.out(); } } public class ProducerConsumerDemo { public static void main(String[] args) { Resource r = new Resource(); Producer p = new Producer(r); Consumer c = new Consumer(r); Thread th1 = new Thread(p); Thread th2 = new Thread(c); Thread th3 = new Thread(p); Thread th4 = new Thread(c); th1.start(); th2.start(); th3.start(); th4.start(); } }