在應用中我們常常需要Thread緩沖池來做一些事以提高程序的效率和並發性本文演示了如何利用Queue這種數據結構實現一個簡單的Thread緩沖池
一個Thread緩沖池可以設計成以下這樣緩沖池由幾個工作Thread和一個Queue組成Client負責把任務放到Queue裡面(put方法)而工作Thread就依次取出這些任務並執行它們(get方法)
Queue的一個經典實現是使用一個循環數組(這個實現在很多數據結構的書上都有介紹)如一個大小為size的數組這個循環數組可以被想象成首尾相連的一個環oldest指向Queue中最老的數據所在的位置next指向下一個可以放新數據的位置
放入一個新數據到next的位置後需要更新nextnext = (next + ) % size;
從oldest位置取出一個數據後需要更新oldestoldest = (oldest + ) % size;
當oldest == next的時候Queue為空
當(next + ) % size == oldest的時候Queue為滿
(注意為了區分Queue為空和為滿的情況實際上Queue裡面最多能放size個數據)
因為這個Queue會同時被多個線程訪問需要考慮在這種情況下Queue如何工作首先Queue需要是線程安全的可以用Java裡的synchronized關鍵字來確保同時只有一個Thread在訪問Queue
我們還可以注意到當Queue為空的時候get操作是無法進行的;當Queue為滿的時候put操作又是無法進行的在多線程訪問遇到這種情況時一般希望執行操作的線程可以等待(block)直到該操作可以進行下去比如但一個Thread在一個空Queue上執行get方法的時候這個 Thread應當等待(block)直到另外的Thread執行該Queue的put方法後再繼續執行下去在Java裡面Object對象的 wait ()notify()方法提供了這樣的功能
[] [] []
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27224.html