2011-07-13 49 views
0

我有一種情況,我想使用Java的固定線程池的擴展。我有N組可運行的對象,我想爭奪資源。但是,我希望線程的總數保持不變。我想要這樣工作的方式在這裏列出具有競爭隊列的​​Java線程池

  1. 分配一個對象有N個線程和M個隊列;
  2. 在隊列m上安排作業n。
  3. 有一個指向第一個隊列的指針 重複 a。如果最大線程數目前正在使用等待。 b。在當前隊列中彈出一個作業 c。將指針移動一個隊列(或從最後一個隊列到第一個隊列)

首先,這樣做是否已經存在?其次,如果不是,我很擔心寫我自己的,因爲我知道寫我自己的線程池可能是危險的。任何人都可以指出我寫自己的一些好例子。

+0

Doug Lea的fork-join會有幫助嗎? –

+0

不幸的是我現在僅限於Java 6。看來fork-join只能在Java 7中使用。 – Jon

+0

M隊列給你的那個隊列不是什麼? –

回答

1

最好的辦法是創建自己的Queue循環隊列。例如(在僞代碼中):

class CyclicQueue {隊列隊列[]; int current = 0;

CyclicQueue(int size) { 
    queues = new Queue[size]; 

    for(int i=0; i<size; i++) 
    queues[i] = new LinkedList<T>(); 
} 

T get() { 
    int i = current; 
    T value; 
    while((value = queues[i].poll() == null) { 
    i++; 
    if(i == current) 
     return null; 
    } 
    return value; 
} 

}

當然,這一點,如果你想阻止你需要補充的是你自己。

在這種情況下,您可能需要爲每個可以通知父隊列的值已添加的隊列定製一個自定義隊列。

+0

謝謝,這也是我的想法。 – Jon