开发思路
消费者线程只负责消费,如果消费栈中有数据那么一直消费直到消费完成。如果消费栈中没有数据则wait。同类消费栈如果数据是满的,生产者不会添加会wait。如果消息栈中没有数据则生产好数据后并通知。
测试main方法
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: ProducerConsumerInfo
* @Description: 类描述
* @Author: bulingfeng
* @CreateDate: 2019/3/19/019 22:42
*/
public class ProducerConsumerInfo {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
Producer producer=new Producer(list);
Consumer consumer=new Consumer(list);
Thread thread1=new Thread(producer);
Thread thread2=new Thread(consumer);
thread1.start();
thread2.start();
}
}
消费者代码
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: Consumer
* @Description: 类描述
* @Author: bulingfeng
* @CreateDate: 2019/3/19/019 22:27
*/
public class Consumer implements Runnable{
private List<String> list;
public Consumer(List<String> list) {
this.list = list;
}
@Override
public void run() {
synchronized (list){
try {
while (true){
if (list.size()<=0){
list.wait();
}else {
for (int i=0;i<list.size();i++) {
list.remove(0);
System.out.println("消费一次,list的size为:"+list.size());
}
list.notifyAll();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
生产者代码
import java.util.List;
/**
* @ClassName: Producer
* @Description: 类描述
* @Author: bulingfeng
* @CreateDate: 2019/3/19/019 22:26
*/
public class Producer implements Runnable{
private List<String> list;
public Producer(List<String> list) {
this.list = list;
}
@Override
public void run() {
synchronized (list){
try {
while (true) {
if (list.size()>=10){
list.wait();
}else if (list.size()==0){
for (int i=0;i<10;i++) {
list.add("有库存");
}
list.notifyAll();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}