package com.iotec.synchronizedTest;
import java.util.LinkedList;
public class ProductorConsumerDemo {
public static void main(String[] args) {
Backet backet = new Backet();
Productor productor = new Productor(backet);
Consumer consumer = new Consumer(backet);
productor.start();
consumer.start();
}
}
class Productor extends Thread{
private Backet backet = null;
public Productor(Backet backet){
super();
this.backet = backet;
}
@Override
public void run() {
backet.pushApple();
}
}
class Consumer extends Thread{
private Backet backet = null;
public Consumer(Backet backet){
super();
this.backet = backet;
}
@Override
public void run() {
backet.popApple();
}
}
class Backet{
private LinkedList<Apple> basket = new LinkedList<>();
//放4轮苹果
public synchronized void pushApple(){
for(int i = 0;i<20;i++){
Apple apple = new Apple(i);
push(apple);
}
}
public synchronized void popApple(){
for(int i = 0;i<20;i++) {
pop();
}
}
//向篮子放苹果
private void push(Apple apple){
//当篮子中存放了5个苹果就等待并通知消费者来消费
if(basket.size()==5){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}//等待并释放当前对象的锁
}
try {
//当不满足5个的时候,则每隔500毫秒放一个苹果
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
basket.addFirst(apple);
System.out.println("存放:"+apple.toString());
notify(); //通知消费者来消费
}
//向篮子取苹果
private void pop(){
//当篮子中存放了0个苹果就等待并通知生产者来生产
if(basket.size()==0){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}//等待并释放当前对象的锁
}
try {
//当不满足5个的时候,则每隔500毫秒放一个苹果
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
Apple apple = basket.removeFirst();
System.out.println("吃掉:"+apple.toString());
notify(); //通知生产者生产
}
}
class Apple{
private int id;
public Apple(int id){
this.id = id;
}
@Override
public String toString() {
return "Appple:"+(id+1);
}
}