//todo : 解释 wait() notifyAll()
范例: 生产者消费者
Storage
package com.rr.current2.c2_3_product_consumer.test;
import java.util.concurrent.TimeUnit;
/**
* Created by Isaac on 16-5-14.
*/
public class Storage {
private int count;
private int size;
public Storage(int size) {
this.size = size;
}
//添加产品
public synchronized void addProduct() {
while (count >= size) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
count += 1;
notifyAll();
System.out.println("添加食物: " + count);
}
public synchronized void getProduct() {
while (count <= 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
count -= 1;
notifyAll();
System.out.println("获取食物: " + count);
}
}
生产者
package com.rr.current2.c2_3_product_consumer.test;
/**
* Created by Isaac on 16-5-14.
*/
public class Producer implements Runnable {
Storage storage;
public Producer(Storage storage) {
this.storage = storage;
}
//生产者负责生产
@Override
public void run() {
for (int i = 0, len = 100; i < len; i++) {
storage.addProduct();
}
}
}
消费者
package com.rr.current2.c2_3_product_consumer.test;
/**
* Created by Isaac on 16-5-14.
*/
public class Customer implements Runnable {
//消费者负责取东西
Storage storage;
public Customer(Storage storage) {
this.storage = storage;
}
//生产者负责生产
@Override
public void run() {
for (int i = 0, len = 100; i < len; i++) {
storage.getProduct();
}
}
}
结果:
Main start!
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
Main end!