JavaマルチスレッドはBlockingQueueブロックキューを併用して生産者と消費者モデルを実現

2892 ワード

1、BlockingQueueの紹介
BlockingQueueは通常、1つのスレッドでオブジェクトを生成し、別のスレッドでオブジェクトのシーンを消費します.1つのスレッドを内側に置き、もう1つのスレッドを内側から取ったBlockingQueue.1つのスレッドは、新しいオブジェクトを生産し続け、キューが収容できる臨界点に達するまでキューに挿入します.つまり、それは限られています.ブロックキューが臨界点に達すると、生産を担当するスレッドが新しいオブジェクトを挿入するときにブロックされます.消費を担当するスレッドがキューからオブジェクトを取り出すまでブロックされます.消費を担当するスレッドは、ブロックされたキューからオブジェクトを取り出し続けます.消費スレッドが空のキューからオブジェクトを抽出しようとすると、この消費スレッドは、本番スレッドがオブジェクトをキューに捨てるまでブロックされます.
2、BlockingQueueのデータput()の入れ方概要
put()メソッドは、指定する要素をこのキューに挿入し、使用可能な空間を待つ.一般的には、ある値>maxSizeの場合、要素を挿入するのに十分なスペースがあるまでブロックされます.
3、BlockingQueueの取得データtake()方法の概要
take()メソッドは、このキューのヘッダを取得して削除します.一般的には、エレメントが使用可能になるまで待機します.Queueの長さ==0のとき、生産者がまた新しいデータを入れるまでブロックされていました.
4、生産者コード
package QueueTest;

import java.util.concurrent.BlockingQueue;
/**
 *     
 * @author   
 *
 */
public class ProducterQueue implements Runnable {
	private final BlockingQueue proQueue;
	
	public ProducterQueue(BlockingQueue proQueue) {
		// TODO Auto-generated constructor stub
		this.proQueue = proQueue;
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 10; i++) {
			try {
				//  10       0 9    1-10 i     0
				//put()             ,        .      >maxSize   ,  ,           
				System.out.println("        :"+i);
				proQueue.put(i);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
}


5、消費者コード
package QueueTest;

import java.util.concurrent.BlockingQueue;
/**
 *     
 * @author   
 *
 */
public class ConsumerQueue implements Runnable {
	
	private final BlockingQueue conQueue;
	
	public ConsumerQueue(BlockingQueue conQueue) {
		// TODO Auto-generated constructor stub
		this.conQueue = conQueue;
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 10; i++) {
			try {
				//take()             ,             ,              。queue    == 0    ,    ,             。
				System.out.println("**************           :"+conQueue.take());
				//           
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}

}


6、メインプログラム入口類
package QueueTest;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
/**
 *       
 * @author   
 *
 */
public class test {
	public static void main(String[] args) {
		//      5           0 5   
		BlockingQueue publicQueue = new LinkedBlockingQueue(5);
		//      
		ProducterQueue pro = new ProducterQueue(publicQueue);
		//      
		ConsumerQueue con = new ConsumerQueue(publicQueue);
		//        
		Thread t1 = new Thread(pro);
		//        
		Thread t2 = new Thread(con);
		//      
		t1.start();
		t2.start();
	}

}

7、困ったことがあったらコメントできる(手紙があれば必ず帰る)小軒微信173821839.