我将GPars用于执行后台任务的并行进程。我使用以下服务来启动一个新的后台线程。
保存堆内存如何限制后台线程数?
如何定义处理后台任务的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)
}
}
}
答案 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个任务将开始。