我们如何绑定ForJoinPool中使用的线程数?

时间:2015-02-09 07:20:43

标签: java multithreading

我有8核CPU,我将一个递归任务并行化为几个子任务。问题是我不希望线程数量超过CPU核心数量。所以,我有一个班级

public class ValueSumCounter extends RecursiveTask<Long>{
    byte[] bytesToProcess;
    public ValueSumCounter(byte[] b) {
        this.bytesToProcess = b;
    }

    @Override
    protected Long compute() {
        List<ValueSumCounter> tasksToCompute;
        //Obtaining list of tasks (more than 100)
    }        
    for(ValueSumCounter task : tasksToCompute) {
        task.join();
    }
}

现在,我想按照以下方式创建ForkJoinPool:

public static void main(String[] args) {
    byte[] bytes;
    //Obtaining bytes of an image and set their to bytes
    new ForkJoinPool().invoke(new ValueSumCounter(bytes));
}

我不知道在此调用期间将创建多少线程。如何明确地将线程数限制为小于核心数(在我的情况下为8)?

1 个答案:

答案 0 :(得分:2)

您可以使用int作为Constructor参数(http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html#ForkJoinPool-int-)创建ForkJoinPool, 因此,您可以控制ForkJoinPool将使用的工作线程数。在你的情况下,你想拥有8,因为你有8个核心,可以这样称呼:

new ForkJoinPool(Runtime.getRuntime().availableProcessors());

编辑: 由于“isnot2bad”注意到您实际上不需要指定工作线程的数量,因为无参数构造函数已经使用了您想要的数字: http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html#ForkJoinPool--

我忽略了这一点,谢谢你的补充。