Lock、Condition实现简单的生产者消费者模式示例
package condition;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 利用Lock、Condition实现生产者消费者模式
* @author will
*
*/
public class ProducerConsumerDemo {
public static void main(String[] args) {
int producerCount = 10;
int consumerCount = 15;
final ProducerConsumerDemo pcd = new ProducerConsumerDemo(5); // 缓冲区大小为5
Thread[] producerThreads = new Thread[producerCount];
for(int i = 0; i < producerCount; i++) {
producerThreads[i] = new Thread("producer" + (i+1)) {
@Override
public void run() {
pcd.produce();
}
};
}
Thread[] consumerThreads = new Thread[consumerCount];
for(int j = 0; j < consumerCount; j++) {
consumerThreads[j] = new Thread("consumer" + (j+1)) {
@Override
public void run() {
pcd.consume();
}
};
}
// 启动生产者消费者线程
for(int i = 0; i < producerCount; i++) {
producerThreads[i].start();
}
for(int j = 0; j < consumerCount; j++) {
consumerThreads[j].start();
}
}
private static final int DEFAULT_BUFFER_SIZE = 10;
private int bufferSize; // 缓冲区大小
private List<Object> bufferList;
private final Lock lock = new ReentrantLock(true);
private final Condition condition = lock.newCondition();
public ProducerConsumerDemo(int bufferSize) {
this.bufferSize = bufferSize > 0 ? bufferSize : DEFAULT_BUFFER_SIZE;
bufferList = new ArrayList<Object>(bufferSize);
}
// 生产
public void produce() {
lock.lock(); // 加锁
try {
while(bufferList.size() == bufferSize) { // 缓冲区满了
System.out.println("Producer wait, thread: " + Thread.currentThread().getName());
condition.await();
}
// 生产
bufferList.add(new Object());
System.out.println("Producer produce one, now buffer size: "
+ bufferList.size() + ", and thread: " + Thread.currentThread().getName());
condition.signalAll(); // 通知消费者
} catch(InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
// 消费
public void consume() {
lock.lock(); // 加锁
try {
while(bufferList.isEmpty()) { // 缓冲区空了
System.out.println("Consumer wait, thread: " + Thread.currentThread().getName());
condition.await();
}
// 消费
bufferList.remove(0); // 从链表头部移除一个
System.out.println("Consumer consumer one, now buffer size: "
+ bufferList.size() + ", and thread: " + Thread.currentThread().getName());
condition.signalAll();
} catch(InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}}
- 精通Java多线程学习(五)用Lock和condition实现生产者与消费者
- 使用 Lock 与Condition 实现生产者消费者
- 24 API-多线程(多线程(多线程JDK5Lock锁,生产者消费者等待唤醒机制,定时器),设计模式(设计原则,设计模式(简单工程,工厂方法,单例模式)
- java多线程之多生产者与多消费者案例之Lock和Condition实现方式
- 使用Lock和Condition实现生产者消费者模型
- Java多线程编程4--Lock的实例--实现生产者/消费者模式:一对一、多对多交替打印
- linux下c++实现简单的生产者消费者队列模式
- JAVA并发实现五(生产者和消费者模式Condition方式实现)
- C++11实现简单生产者消费者模式
- Lock_Condition生产者消费者模式之官方版
- Java多线程实现生产者消费者程序(Wait,Notify实现和Lock,Condition实现)
- java线程协作,经典生产者/消费者模式(二、Lock和Condition)
- Java多线程实现简单生产者消费者模式
- java 编码实现简单的生产者-消费者模式
- 使用JUC并发工具包的Lock和Condition,实现生产者和消费者问题中的有界缓存
- Ruby简单的生产者,消费者模式的实现
- 生产者消费者模型(多个生产者和多个消费者)JDK1.5 (Lock&Condition)实现版
- 使用lock&condition实现生产者消费者
- 【Java并发】生产者-消费者模式简单实现(模拟消息队列)
- 生产者-消费者模式 系列 之二 ReentrantLock, Condition 篇