【问题标题】:Restrict the Number of Threads in Gpars?限制 Gpars 中的线程数?
【发布时间】:2013-08-26 22:49:05
【问题描述】:

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

【问题讨论】:

    标签: java spring grails grails-2.0 gpars


    【解决方案1】:

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


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

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


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

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

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

    【讨论】:

    • 我做对了吗? Service 是 Singelton,因此我的应用程序只有一个实例。 pool = new ForkJoinPool() 是否只会实例化一次?
    • 当我使用 pool = new ForkJoinPool(4) 并调用 taskService.从我的应用程序执行 5 次。在这种情况下会发生什么? 5个任务是从4个线程执行还是4个任务执行完最后一个任务被阻塞?
    • 默认情况下,Grails 服务是 Singelton:grails.org/doc/latest/guide/services.html
    猜你喜欢
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多