2011-04-17 93 views
1

我正在使用Spring ThreadPoolTask​​Executor來執行我的線程。 我想將我的線程分成幾組,並且每個組都有不同的最大允許線程數。組織線程併爲每個組設置不同的最大線程數

例如,這樣的事情:

for (MyTask myTask : myTaskList){ 
    threadPoolTaskExecutor.setMaxThreadsForGroup(myTask.getGroupName(), myTask.getMaxThreads()); 
    threadPoolTaskExecutor.execute(myTask, myTask.getGroupName()); 
} 

不知何故,ThreadPoolTask​​Executor類應該知道,只允許myTask.getMaxThreads()到每個命名myTask.getGroupName(組),並在所有任務的最大線程數都在一起不應該超過在applicationContext.xml中爲threadPoolTask​​Executor定義的內容

是否可以以簡單的方式執行?

感謝

回答

1

我可以看到這樣做有兩種方式。第一個(也是最簡單的)方法是創建一個Map<String, ExecutorService>,它將您的組名映射到具有最大線程限制的特定執行程序。這並不能滿足您的要求,因爲總體線程的數量是最大的,但我認爲這個要求可能是不合理的,因爲無論如何,您永遠無法完全控制在Java應用程序中運行的線程數量。

第二種方式,雖然比較複雜,但能給你更多的控制。您可以擁有一個最大池大小的執行程序,而不是直接向其提交作業,而是提交執行真實BlockingQueue任務的工作任務,並處理它們,直到沒有剩餘任務。您提交的工作任務數量將等於組線程限制。僞代碼可能是這樣的:

ExecutorService executor = ... 

int groupThreadLimit = 3; 
final BlockingQueue<Runnable> groupTaskQueue = ...; 

// Add all your tasks to the groupTaskQueue. 

for(int i = 0; i < groupThreadLimit; i++) { 
    executor.execute(new Runnable() { 
     public void run() { 
      while(true) { 
       Runnable r = groupTaskQueue.pollFirst(); 
       if(r == null) { 
        return; // All tasks complete or being processed. Queue empty. 
       } 
       r.run(); 
      } 
     } 
    }); 
} 

這種技術的只有輕微的缺點是一旦工人開始工作,他們不會屈服,直到所有的子任務完成。如果您有一個合理的使用政策並希望避免飢餓,這可能會很糟糕。

相關問題