2015-11-09 112 views
0

在我的服務,我需要有ňň不同的目錄(ñ變爲1〜8)運行的東西,不同的線程。春@asynch線程併發共享資源

我需要執行ķ不同的任務(ķ進入爲1〜10000),每個任務被綁定到單個目錄,我需要在N1目錄執行K1任務只有當n1上沒有活動線程。

我是新來的春天,我想用@Async註釋,我已經不知道如何設置池在這種情況下。

for(int task = 1; task<=1000;task++){ 
    executeAsynchMethod(directoryNumber); 
} 

executeAsynchMethod應保持空閒狀態,直到同一目錄中沒有其他任務。

UPDATE: 例如: 的executeAsynchMethod開始在每一個可用線程:
線程1 - >適用於目錄1
線程2 - >適用於目錄2
...
threadn - >適用於目錄ñ
只要線程完成工作,它就會「釋放」它的目錄,並且我希望在這個目錄上運行一個任務。
thread7 - > directory7是免費
thread7(或其他空閒線程) - >開始directory7新任務

+0

你可以預先通過他們必須運行的目錄來分割任務,然後依次運行它們嗎? – jny

+0

不可以,因爲任務可以有非常不同的執行時間(從10秒到10分鐘),並且我希望在整個執行過程中所有可能的線程都處於活動狀態。 我甚至不知道這是較長的任務:d – Jacopo

+0

但是,如果有關於N1目錄X1的​​任務,執行時間將至少需要X1×持續時間,無論你做什麼。但是,如果一些其他的任務將花費更少的時間,'ThreadPool'將確保下一個任務將被釋放出來的任務得到執行。 – jny

回答

1

我看到2個選項...

  1. 如果目錄名或更多少不要緊,使用任務中的threadname到指定的目錄,並與maximum number of threads <= number of directories配置線程池,如

    @Override 
    @Bean 
    public Executor getAsyncExecutor() { 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
    executor.setMaxPoolSize(numberofdirectories); 
    executor.setCorePoolSize(corepoolsize); 
    executor.setThreadNamePrefix("directorynameprefix"); 
    
    return executor; 
    

    }

  2. 使用Java Concurrent集合像ConcurrentLinkedDeque來跟蹤空閒目錄並從任務本身訪問它。當目錄不可用的情況下,需要邏輯