天天看點

一個簡單的 Thread 緩沖池的實作

http://www.pcjx.com/Java/xeji/47233.html

文章來源:ChinaITLab收集整理 作者:佚名 更新時間:2005-10-22

     一個Thread緩沖池可以設計成以下這樣:緩沖池由幾個工作Thread和一個Queue組成,Client負責把任務放到Queue裡面(put方法),而工作Thread就依次取出這些任務并執行它們(get方法)。

  Queue的一個經典實作是使用一個循環數組(這個實作在很多資料結構的書上都有介紹),如一個大小為size的數組,這個循環數組可以被想象成首尾相連的一個環。 oldest指向Queue中最老的資料所在的位置,next指向下一個可以放新資料的位置。

  

  放入一個新資料到next的位置後,需要更新next:next = (next + 1) % size;

  

  從oldest位置取出一個資料後,需要更新oldest:oldest = (oldest + 1) % size;

  

  當oldest == next的時候,Queue為空,

  

  當(next + 1) % size == oldest的時候,Queue為滿。

  

  (注意:為了區分Queue為空和為滿的情況,實際上Queue裡面最多能放size-1個資料。 )

  

  因為這個Queue會同時被多個線程通路,需要考慮在這種情況下Queue如何工作。 首先,Queue需要是線程安全的,可以用Java裡的synchronized關鍵字來確定同時隻有一個Thread在通路Queue.

  

  我們還可以注意到當Queue為空的時候,get操作是無法進行的;當Queue為滿的時候,put操作又是無法進行的。 在多線程通路遇到這種情況時,一般希望執行操作的線程可以等待(block)直到該操作可以進行下去。 比如,但一個Thread在一個空Queue上執行get方法的時候,這個 Thread應當等待(block),直到另外的Thread執行該Queue的put方法後,再繼續執行下去。 在Java裡面,Object對象的 wait(),notify()方法提供了這樣的功能。

繼續閱讀