Java 多執行緒應用 之 ArrayBlockingQueue

君墨痕發表於2013-09-23

ArrayBlockingQueue,顧名思義是阻塞佇列,通過設定佇列的最大容量開來達到控制最多允許幾條執行緒再同時執行。還有幾個類也可以達到相同的效果。這是幾個月前看了下Java多執行緒應用的教程,好像是張孝祥的,翻到了之前寫的程式碼就貼出來。

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockingQueueCommunication {

	public static void main(String[] args) {

		final Business business = new Business();
		new Thread(new Runnable() {
			public void run() {
				for (int i = 1; i <= 4; i++) {
					business.sub(i);
				}
			}
		}).start();

		new Thread(new Runnable() {
			public void run() {
				for (int i = 1; i <= 4; i++) {
					business.main(i);
				}
			}
		}).start();

	}

	// 說明:在這個靜態類裡定義兩個阻塞佇列,容量是1,來實現相互通知
	// 需要開始往佇列1放東西,同時佇列2是阻塞的,那麼就需要初始化時往佇列2中放東西,讓其阻塞
	// 往佇列1中放完東西后它會阻塞,執行完這個方法之前要讓佇列2中的東西取走,讓其不阻塞,然後就可以執行佇列2下面的程式碼
	// 同樣道理,在佇列2所在的方法執行完之前要取走佇列1中的東西,讓佇列1不阻塞。這樣就實現了你一下我一下交替執行程式碼

	static class Business {

		BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<Integer>(1);
		BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<Integer>(1);

		// 構造塊,
		{
			try {
				System.out.println("例項初始化時往佇列2種put一下");
				queue2.put(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		public void sub(int i) {
			try {
				queue1.put(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			for (int j = 1; j <= 2; j++) {
				System.out.println("sub thread sequece of " + j + ",loop of "
						+ i);
			}
			try {
				queue2.take();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		public void main(int i) {
			try {
				queue2.put(1);
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			for (int j = 1; j <= 3; j++) {
				System.out.println("main thread sequece of " + j + ",loop of "
						+ i);
			}
			System.out.println();
			try {
				queue1.take();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

執行結果:


相關文章