生产者消费者模型说明:生产者消费者问题
Java程序示例如下:
package thread;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class AddSub {
public static void main(String[] args) {
Goods goods = new Goods();
// Thread t1 = new Thread(new SetTask(goods));
// Thread t2 = new Thread(new GetTask(goods));
//
// t1.start();
// t2.start();
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.execute(new SetTask(goods));
executor.execute(new SetTask(goods));
executor.execute(new GetTask(goods));
executor.execute(new GetTask(goods));
}
}
/*
* 生产者
*/
class SetTask implements Runnable {
private Goods _goods = null;
public SetTask(Goods goods) {
_goods = goods;
}
public void run() {
while (true) {
try {
_goods.set();
Thread.sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/*
* 消费者
*/
class GetTask implements Runnable {
private Goods _goods = null;
public GetTask(Goods goods) {
_goods = goods;
}
public void run() {
while (true) {
try {
_goods.get();
Thread.sleep(100);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/*
* 待生产和消费的物品
*/
class Goods {
Random _rand = new Random();
private List<Integer> _list = new ArrayList<Integer>();
Lock _lock = new ReentrantLock();
Condition _setCondition = _lock.newCondition();
Condition _getCondition = _lock.newCondition();
// 生产
public void set() {
_lock.lock();
try {
while (_list.size() == 5) {
_setCondition.await();
}
int data = _rand.nextInt(10);
_list.add(data);
System.out.println("set() " + data);
_getCondition.signal();
}
catch (InterruptedException e) {
e.printStackTrace();
}
finally {
_lock.unlock();
}
}
// 消费
public void get() {
_lock.lock();
try {
while (_list.size() == 0) {
_getCondition.await();
}
System.out.println("get() " + _list.remove(0));
_setCondition.signal();
}
catch (InterruptedException e) {
e.printStackTrace();
}
finally {
_lock.unlock();
}
}
}