package thread;
import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 使用 Lock 与Condition 实现生产者消费者
* Condition 中的 await 、 signal 、 signalAll 都与使用synchronized 同步块时的wait notify 功能类似。
* @author zhoufeng
*
*/
public class LockConditionTest {
private LinkedList<String> bag = new LinkedList<String>();
private int maxSize = 10 ; //篮子最大容量
private Lock lock = new ReentrantLock() ;
// 这里处理篮子满了 和篮子空了 的信号 都用该Condition 。 也可以用lock 创建两个Condition 分别处理这两种情况
private Condition fullCondition = lock.newCondition() ;
public void put(String e){
lock.lock() ;
try{
while(bag.size() == maxSize)
fullCondition.await() ;
bag.add(e);
System.out.println("放入一个馒头... 总数量:" + bag.size());
fullCondition.signalAll();
}catch(Exception ex ){
ex.printStackTrace() ;
}finally{
lock.unlock() ;
}
}
public String take(){
String result = null ;
lock.lock() ;
try{
while(bag.size() == 0)
fullCondition.await() ;
result = bag.removeLast();
System.out.println("取出一个馒头... 总数量:" + bag.size());
fullCondition.signalAll();
}catch(Exception e ){
e.printStackTrace() ;
}finally{
lock.unlock() ;
}
return result ;
}
private class Producer implements Runnable{
public void run() {
for (int i = 0; i < 100 ; i++) {
put("" + i);
}
}
}
private class Customer implements Runnable{
public void run() {
for (int i = 0; i < 100 ; i++) {
take();
}
}
}
public static void main(String[] args) {
LockConditionTest tct = new LockConditionTest();
new Thread(tct.new Producer()).start();
new Thread(tct.new Customer()).start();
new Thread(tct.new Producer()).start();
new Thread(tct.new Customer()).start();
new Thread(tct.new Producer()).start();
new Thread(tct.new Customer()).start();
}
}
使用 Lock 与Condition 实现生产者消费者
最新推荐文章于 2022-06-27 13:59:13 发布