2013-08-26 5 views
1

배경 작업을 수행하는 병렬 프로세스에 GPars을 사용합니다. 다음 서비스를 사용하여 새 백그라운드 스레드를 시작합니다.Gpars의 스레드 수 제한?

  1. 힙 메모리를 절약하려면 어떻게 백그라운드 스레드 수를 제한 할 수 있습니까?

  2. 백그라운드 작업을 처리하는 스레드로 구성된 스레드 풀을 어떻게 정의 할 수 있습니까?

    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 개의 작업이 실행되고 마지막 작업이 차단됩니까?

작업에 따라 다릅니다. 포크/조인 풀의 기본 개념은 작업자가 스레드를 차단할 지점에 도달하면 다른 작업으로 전환한다는 것입니다. 수행 할 수있는 작업이 없으면 스레드를 차단합니다.

예에서 처음 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