Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 以Android環境為例的多線程學習筆記(三)-----------阻塞隊列

以Android環境為例的多線程學習筆記(三)-----------阻塞隊列

編輯:關於Android編程

對於許多多線程的問題,其實是可以通過使用一個或多個隊列以安全的方式將其形式化的,即使用隊列可以安全的從一個線程

向另一個線程傳輸數據。其中阻塞隊列就是一種很有用的工具,工作者線程可以周期性的將中間結果存儲在阻塞隊列中,而其他工作者

線程則可以移出中間結果並進行加以修改,而且在其運行的同時隊列還會自動的平衡負載。

-----------YYC

本部分則以用阻塞隊列的方式解決生產者和消費者問題來作為具體實例進行說明。生產者線程向隊列中插入元素,消費者線程

則從中取出它們,特別是當試圖向隊列中添加元素而隊列已滿,或者想從隊列中移出元素而隊列為空的時候,阻塞隊列則會導致當前的

這個隊列阻塞。

For Example:

//先定義生產者和消費者類

class Producer implements Runnable {
	 
	    private final BlockingQueue sharedQueue;
	 
	    public Producer(BlockingQueue sharedQueue) {
	        this.sharedQueue = sharedQueue;
	    }
	 
	    @Override
	    public void run() {
	        for(int i=0; i<10; i++){
	            try {
	                System.out.println("Produced: " + i);
	                sharedQueue.put(i);
	                //如果該隊列已滿則會自動阻塞該線程 
	                //如果該線程在阻塞的過程中被中斷則會發生中斷異常
	            } catch (InterruptedException ex) {
	                Logger.getLogger(Producer.class.getName()).log(Level.SEVERE, null, ex);
	            }
	        }
	    }
	}
	 
	
	class Consumer implements Runnable{
	 
	    private final BlockingQueue sharedQueue;
	 
	    public Consumer (BlockingQueue sharedQueue) {
	        this.sharedQueue = sharedQueue;
	    }
	 
	    @Override
	    public void run() {
	        while(true){
	            try {
	                System.out.println("Consumed: "+ sharedQueue.take());
	                //如果該阻塞隊列為空則會自動阻塞該線程
	            } catch (InterruptedException ex) {
	                Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);
	                break;
	            }
	        }
	       
	    }
	 
	}


//調用過程

case R.id.button3://阻塞隊列實現生產者和消費者模式
	             BlockingQueue sharedQueue = new LinkedBlockingQueue();//容量沒有上界的阻塞隊列
			 
		     Thread prodThread = new Thread(new Producer(sharedQueue));
		     Thread consThread = new Thread(new Consumer(sharedQueue));
		     
		     prodThread.start();
		     consThread.start();
		     break;
在JAVA的concurrent包中其實是提供了阻塞隊列的幾個變種的,上面的代碼中選擇的是LinkedBlockingQueue型,這種隊列的默認容量是沒有

上界的,但是,也可以自己手動的設置最大容量。此外還有LinkedBlockingDeque型這是一個雙端隊列版本、ArrayBlockingQueue是可以用來設置是否需要公平性的隊列、PriorityBlockingQueue是一種帶優先級的隊列,而不是簡單的先進先出的隊列,元素會按照他們的優先級順序被移出,該類型也是沒有容量

上限的。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved