手机
当前位置:查字典教程网 >编程开发 >Java >Lock、Condition实现简单的生产者消费者模式示例
Lock、Condition实现简单的生产者消费者模式示例
摘要:复制代码代码如下:packagecondition;importjava.util.ArrayList;importjava.util.Li...

复制代码 代码如下:

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();

}

}

}

【Lock、Condition实现简单的生产者消费者模式示例】相关文章:

Java泛型的简单实例

浅析Java中Split函数的用法技巧

Java序列化机制与原理的深入分析

java 实现约瑟夫环的实例代码

java中servlet实现登录验证的方法

java枚举的使用示例

JAVA实现线程的三种方法

Spring实现文件上传(示例代码)

MySQL实现远程登录的方法

JAVA实现多线程的两种方法实例分享

精品推荐
分类导航