多线程--生产者/消费者

/**
* Created by Administrator on 2017/6/26.
* 生产者/消费者问题
* 生产者(Producer)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,
* 店员一次只能持有固定数量的产品,如果生产者试图生产更多的产品,
* 店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;
* 如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。
*/
public class TestProduct {
public static void main(String[] args) {
Clerk clerk = new Clerk();
Producer p1 = new Producer(clerk);
Thread t1 = new Thread(p1);
Thread t2 = new Thread(p1);

Customer c1 = new Customer(clerk);
Thread t3 = new Thread(c1);

t1.start();
t2.start();
t3.start();
}
}

/**
* 生产者类
*/
class Producer implements Runnable{
Clerk clerk;
public Producer(Clerk clerk){ this.clerk=clerk; }
@Override
public void run() {
System.out.println("生产产品");
while (true){
try {
Thread.sleep((int)(Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.addProduct();
}
}
}

/**
* 消费者类
*/
class Customer implements Runnable{
Clerk clerk;
public Customer(Clerk clerk){ this.clerk=clerk;}

@Override
public void run() {
System.out.println("消费产品");
while (true){
try {
Thread.sleep((int)(Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.consumeProduct();
}
}
}

/**
* 店员类
*/
class Clerk{
int product;
public synchronized void consumeProduct(){
if(product<=0){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
System.out.println(Thread.currentThread().getName()+":消费 "+product);
product--;
notifyAll();
}
}
public synchronized void addProduct(){
if(product>=20){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
product++;
System.out.println(Thread.currentThread().getName()+": 生产 "+product);
notifyAll();
}
}
}
原文地址:https://www.cnblogs.com/wjunxia/p/7082354.html