您的位置:首页 > 产品设计 > UI/UE

Java阻塞队列BlockingQueue实现生产者消费者-只有代码-不讲原理

2014-02-16 11:42 756 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息