// 生产者
class Factory {
private List<Integer> array;
private int index = 1;
public Factory(List<Integer> array) {
this.array = array;
}
public void create() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized (array) {
try {
Thread.sleep(200);
if (array.size() == 1) {
array.wait();
} else {
array.add(index);
System.out.println(Thread.currentThread().getId() + "--生产:" + index);
index++;
array.notify();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
}
// 消费者
class Customer {
private List<Integer> array;
public Customer(List<Integer> array) {
this.array = array;
}
public void get() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized (array) {
try {
Thread.sleep(200);
if (array.size() == 0) {
array.wait();
} else {
System.out.println(Thread.currentThread().getId() + "--获取:" + array.get(0));
array.remove(0);
array.notify();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
Factory factory = new Factory(list);
Customer customer = new Customer(list);
factory.create();
customer.get();
}
会出现成产一个,消费一个交替运行的情况。当调用方法改成了:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
Factory factory = new Factory(list);
Customer customer = new Customer(list);
for (int i = 0; i < 5; i++) {
factory.create();
customer.get();
}
}
则有可能运行一段时间就出现假死的情况,解决办法:将notify方法换成notifyAll