packageyunche.test.producer;importjava.util.LinkedList;importjava.util.Random;/*** @ClassName: Producer
* @Description: 生产者
*@author: yunche
* @date: 2018/08/26*/
public class Producer implementsRunnable
{private final LinkedListlist;/*** 缓冲区大小*/
private final intmaxSize;public Producer(LinkedList list, intsize)
{this.list =list;
maxSize=size;
}
@Overridepublic voidrun()
{try{while(true)
{//模拟耗时1s
Thread.sleep(1000);synchronized(list)
{if(list.size()==maxSize)
{
System.out.println("缓冲区已满,正在等待消费者消费..." +System.currentTimeMillis());
list.wait();
}else{
list.add(produce());
list.notifyAll();
}
}
}
}catch(InterruptedException e)
{
e.printStackTrace();
}
}private intproduce()
{int n = new Random().nextInt(10000);
System.out.println("Thread: " + Thread.currentThread().getName() + " produce: " +n);returnn;
}
}packageyunche.test.producer;importjava.util.Date;importjava.util.LinkedList;/*** @ClassName: Consumer
* @Description: 消费者
*@author: yunche
* @date: 2018/08/26*/
public class Consumer implementsRunnable
{private final LinkedListlist;publicConsumer(LinkedList list)
{this.list =list;
}
@Overridepublic voidrun()
{while (true)
{try{synchronized(list)
{//模拟耗时
Thread.sleep(1000);if(list.isEmpty())
{
System.out.println("缓冲区已空,正在等待生产者生产..." + System.currentTimeMillis() +Thread.currentThread().getName());
list.wait();
}else{
consume(list.poll());
list.notifyAll();
}
}
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}private voidconsume(Integer n)
{
System.out.println("Thread:" + Thread.currentThread().getName() + " consume: " +n);
}
}packageyunche.test.producer;importjava.util.ArrayList;importjava.util.LinkedList;importjava.util.List;/*** @ClassName: Main
* @Description: 测试类
*@author: yunche
* @date: 2018/08/26*/
public classMain
{public static voidmain(String[] args)
{
LinkedList list = new LinkedList<>();
Producer p= new Producer(list, 10);
Consumer c1= newConsumer(list);
Consumer c2= newConsumer(list);
Thread producer= newThread(p);
producer.setName("生产者线程");
Thread consumer1= newThread(c1);
consumer1.setName("消费者1");
Thread consumer2= newThread(c2);
consumer2.setName("消费者2");
producer.start();
consumer1.start();
consumer2.start();
}
}