2013-08-26 2 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) конструктор, который позволяет намекать на «количество параллельности». Я понимаю, что на практике это контролирует количество потоков, которые будут использовать пул.


Могу ли я получить это право? Служба является Singleton, поэтому для моего приложения есть только один экземпляр. Делает ли pool = new ForkJoinPool() экземпляр только один раз?

Я не специалист по grails :-). Все, что я могу сказать, заключается в том, что каждый раз, когда вы создаете экземпляр класса Java ForkJoinPool, вы создаете новый пул.


Когда я использую pool = new ForkJoinPool(4) и я называю taskService. executeAsync(...) 5 раз из моего приложения. Что происходит в этом случае? Будут ли выполняться 5 задач из 4 потоков или будет выполнена 4 задача, и последняя задача будет заблокирована?

Это зависит от того, что делают задачи. Основная идея пула fork/join заключается в том, что когда работник достигает точки, в которой он блокирует поток, он переключается на другую задачу. Он только блокирует поток, если нет работы, которая может быть выполнена.

Итак, в вашем примере должны начаться первые 4 задачи и продолжать работать до тех пор, пока один из блоков задач не будет выполнен. Если/когда это произойдет, начнется пятая задача.

+0

Правильно ли это? Служба является Singelton, поэтому для моего приложения есть только один экземпляр. Будет ли пул = новый 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

 Смежные вопросы

  • Нет связанных вопросов^_^