2013-08-26 50 views
1

我使用GPars來執行後臺任務的並行進程。我使用以下服務來啓動一個新的後臺線程。限制Gpars中的線程數量?

  1. 保存堆內存如何限制後臺線程的數量?

  2. 如何定義處理我的後臺任務的n個線程的線程池?

    import jsr166y.ForkJoinPool 
    
    class TaskService { 
    
    
    private pool = new ForkJoinPool() 
    
    def executeAsync(args, closure = null) { 
        if(!closure) { 
         closure = args 
         args = null 
        } 
    
        GParsPool.withExistingPool(pool) { 
         closure.callAsync(args) 
        } 
    } 
    } 
    

回答

3

有一個ForkJoinPool(int)構造,使您可以在「並行的量」暗示。我的理解是在實踐中控制池將使用的線程數。


難道我得到這個權利?服務是單身人士,所以我的應用只有一個實例。 pool = new ForkJoinPool()只會實例化一次嗎?

我不是一個grails專家:-)。我只能說,每次你實例化Java類ForkJoinPool時,你都在創建一個新的池。


當我使用pool = new ForkJoinPool(4),我叫taskService. executeAsync(...) 5次從我的應用程序。在這種情況下會發生什麼?這5個任務是從4個線程執行還是執行4個任務,最後一個任務將被阻止?

這取決於任務的作用。 fork/join池的基本思想是,當一個worker到達一個會阻塞該線程的地方時,它會切換到另一個任務。如果沒有可以完成的工作,它只會阻塞線程。

所以在你的例子中,前4個任務應該開始,並繼續運行,直到其中一個任務阻止。如果/發生這種情況,第五項任務將開始。

+0

我是否明白這一點?服務是Singelton,所以我的應用只有一個實例。 pool = new ForkJoinPool()只會實例化一次嗎? – confile

+0

當我使用pool = new ForkJoinPool(4)並調用taskService時。 executeAsync(...)5次從我的應用程序。在這種情況下會發生什麼?這5個任務是從4個線程執行還是執行4個任務,最後一個任務將被阻止? – confile

+0

默認情況下,Grails服務是Singelton:http://grails.org/doc/latest/guide/services.html – confile