Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 限制GPAR中的线程数?_Java_Spring_Grails_Grails 2.0_Gpars - Fatal编程技术网

Java 限制GPAR中的线程数?

Java 限制GPAR中的线程数?,java,spring,grails,grails-2.0,gpars,Java,Spring,Grails,Grails 2.0,Gpars,我用于执行后台任务的并行进程。我使用以下服务启动一个新的后台线程 要保存堆内存,如何限制后台线程的数量 如何定义由n个线程组成的线程池来处理后台任务 import jsr166y.ForkJoinPool class TaskService { private pool = new ForkJoinPool() def executeAsync(args, closure = null) { if(!closure) { closure = args

我用于执行后台任务的并行进程。我使用以下服务启动一个新的后台线程

  • 要保存堆内存,如何限制后台线程的数量

  • 如何定义由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)
        }
    }
    }
    
  • 有一个构造函数允许您提示“并行量”。我的理解是,实际上,它控制池将使用的线程数



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

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


    当我使用
    pool=newforkjoinpool(4)
    并调用
    taskService时。从我的应用程序执行同步(…)
    5次。在这种情况下会发生什么?是从4个线程执行5个任务,还是执行4个任务并阻止最后一个任务

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


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

    我做对了吗?一个服务是Singleton,所以我的应用只有一个实例。pool=new ForkJoinPool()是否只实例化一次?当我使用pool=new ForkJoinPool(4)并调用taskService时。从我的应用程序执行同步(…)5次。在这种情况下会发生什么?这5个任务是从4个线程执行,还是执行4个任务并阻止最后一个任务?默认情况下,Grails服务是Singleton: