Javaブロック列BlockingQue生産者の消費者を実現します。コードだけです。
2664 ワード
package com.thread.test;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* 、
* :http://www.cnblogs.com/jackyuj/archive/2010/11/24/1886553.html
*
* @author [email protected] 2014-2-16 11:11:15
*/
public class ProducerConsumerWithBlockingQueue {
/** */
private int size = 3;
/** */
private BlockingQueue queue = new ArrayBlockingQueue(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