package com.thread.test;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* 用阻塞队列实现生产者、消费者 <br>
* 各种阻塞队列的区别见:http://www.cnblogs.com/jackyuj/archive/2010/11/24/1886553.html
*
* @author 胡凯旋837087787@qq.com 2014-2-16 上午11:11:15
*/
public class ProducerConsumerWithBlockingQueue {
/** 队列的大小 */
private int size = 3;
/** 阻塞队列 */
private BlockingQueue<String> queue = new ArrayBlockingQueue<String>(size);
public static void main(String[] args) {
// 新建对象
ProducerConsumerWithBlockingQueue test = new ProducerConsumerWithBlockingQueue();
System.out.println("队列大小:" + test.size);
final Producer producer = test.new Producer();
final Customer customer = test.new Customer();
// 循环50次,每次新起一个生产者线程和一个消费者线程
for (int i = 0; i < 50; i++) {
new Thread(new Runnable() {
@Override
public void run() {
producer.put(); // 存入队列
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
customer.take(); // 从队列中取出
}
}).start();
}
}
/** 生产者类 */
class Producer {
/** 存入队列 */
public void put() {
String element = "队列中的元素:" + Thread.currentThread().getName();
System.out.println("生产者存入:" + element + " 当前队列大小:" + queue.size() + (queue.size() == size ? " 队列已经阻塞" : ""));
try {
queue.put(element); // 存入队列中,如果队列满了就阻塞。注意这里不要用queue.add(element),会产生异常
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/** 消费者类 */
class Customer {
/** 从队列取出 */
public void take() {
try {
String element = queue.take(); // 取出队列中的元素。注意这里不要用queue.remove(),会产生异常
System.out.println("消费者取出:" + element);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
执行结果:(由于是多线程,所以每次执行结果都不一样)
队列大小:3
生产者存入:队列中的元素:Thread-0 当前队列大小:0
生产者存入:队列中的元素:Thread-2 当前队列大小:1
消费者取出:队列中的元素:Thread-0
生产者存入:队列中的元素:Thread-4 当前队列大小:0
消费者取出:队列中的元素:Thread-2
生产者存入:队列中的元素:Thread-6 当前队列大小:1
消费者取出:队列中的元素:Thread-4
消费者取出:队列中的元素:Thread-6
生产者存入:队列中的元素:Thread-8 当前队列大小:0
消费者取出:队列中的元素:Thread-8
生产者存入:队列中的元素:Thread-12 当前队列大小:0
生产者存入:队列中的元素:Thread-10 当前队列大小:1
生产者存入:队列中的元素:Thread-14 当前队列大小:2
生产者存入:队列中的元素:Thread-16 当前队列大小:3 队列已经阻塞
生产者存入:队列中的元素:Thread-18 当前队列大小:3 队列已经阻塞
消费者取出:队列中的元素:Thread-12
生产者存入:队列中的元素:Thread-20 当前队列大小:3 队列已经阻塞
生产者存入:队列中的元素:Thread-22 当前队列大小:3 队列已经阻塞
消费者取出:队列中的元素:Thread-10