在應用中
一個Thread緩沖池可以設計成以下這樣
Queue的一個經典實現是使用一個循環數組(這個實現在很多數據結構的書上都有介紹)
放入一個新數據到next的位置後
從oldest位置取出一個數據後
當oldest == next的時候
當(next +
(注意
因為這個Queue會同時被多個線程訪問
我們還可以注意到當Queue為空的時候
把上面的內容結合起來
public class SyncQueue {
public SyncQueue(int size) {
_array = new Object[size];
_size = size;
_oldest =
_next =
}
public synchronized void put(Object o) {
while (full()) {
try {
wait();
} catch (InterruptedException ex) {
throw new ExceptionAdapter(ex);
}
}
_array[_next] = o;
_next = (_next +
notify();
}
public synchronized Object get() {
while (empty()) {
try {
wait();
} catch (InterruptedException ex) {
throw new ExceptionAdapter(ex);
}
}
Object ret = _array[_oldest];
_oldest = (_oldest +
notify();
return ret;
}
protected boolean empty() {
return _next == _oldest;
}
protected boolean full() {
return (_next +
}
protected Object [] _array;
protected int _next;
protected int _oldest;
protected int _size;
}
可以注意一下get和put方法中while的使用
在以上代碼中使用了ExceptionAdapter這個類
接下來我們需要一個對象來表現Thread緩沖池所要執行的任務
最後
public class Worker implements Runnable {
public Worker(SyncQueue queue) {
_queue = queue;
}
public void run() {
while (true) {
Runnable task = (Runnable) _queue
task
}
}
protected SyncQueue _queue = null;
}
下面是一個使用這個Thread緩沖池的例子
//構造Thread緩沖池
SyncQueue queue = new SyncQueue(
for (int i =
new Thread(new Worker(queue))
}
//使用Thread緩沖池
Runnable task = new MyTask();
queue
為了使本文中的代碼盡可能簡單
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27553.html