限制Gpars中的线程数?

时间:2013-08-26 22:49:06

标签: java spring grails grails-2.0 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)
        }
    }
    }
    

1 个答案:

答案 0 :(得分:3)

有一个ForkJoinPool(int)构造函数,允许您提示“并行量”。我的理解是在实践中控制池将使用的线程数。


  

我能做到这一点吗?服务是单身人士,因此我的应用只有一个实例。 pool = new ForkJoinPool()只会实例化一次吗?

我不是grails专家:-)。我只能说每次实例化Java类ForkJoinPool时都会创建一个新池。


  

当我使用pool = new ForkJoinPool(4)并从我的应用中拨打taskService. executeAsync(...) 5次时在这种情况下会发生什么?是从4个线程执行5个任务还是执行4个任务,最后一个任务将被阻止?

这取决于任务的作用。 fork / join池的基本思想是当一个worker到达阻塞线程的点时,它会切换到另一个任务。如果没有可以完成的工作,它只会阻塞线程。

因此,在您的示例中,前4个任务应该启动,并继续运行,直到其中一个任务阻止。如果/当发生这种情况时,第5个任务将开始。