1

我将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)
        }
    }
    }
    
4

1 回答 1

3

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


我做对了吗?服务是一个单例,所以我的应用程序只有一个实例。pool = new ForkJoinPool()只会实例化一次吗?

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


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

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

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

于 2013-08-26T23:58:26.253 回答