Javaブロック列BlockingQue生産者の消費者を実現します。コードだけです。


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