繁体   English   中英

为什么这个简单的java fork join pool不起作用?

[英]Why doesn't this simple java fork join pool work?

我即将测试这个forkjoin池,但它不能正常工作。 我想知道为什么?

这是我为获取数组而添加3个元素的类:

import static java.util.concurrent.ForkJoinTask.invokeAll;
import java.util.concurrent.RecursiveAction;

public class t extends RecursiveAction{

    private final int array[];
    private final int th=4;

    public t (int array[]){
        this.array=array;
    }

    protected void compdir(){

        for (int i=0;i<array.length;i++){
            array[i]=array[i]+3;
        }
    }

    @Override
    protected void compute(){
        int cont=1;

        System.out.println("array="+(array[0])+","+array[array.length-1]);


        System.out.println("cont="+cont);
        if (array.length<th){      
            compdir();

        } else {

            int spil=(array[0]+array[(array.length-1)])/2;
            int array1[]=new int[spil];
            int array2[]=new int[spil];
            for (int i=0;i<array1.length;i++){
                array1[i]=array[i];
            }
            for (int i=0;i<array2.length;i++){
                array2[i]=array[i+(array1.length)];
            }
            invokeAll(new t(array1) , new t(array2));
            cont++;
        }
    }

}

这是主要的课程:

package nt;

import java.util.concurrent.ForkJoinPool;

public class Nt {


    public static void main(String[] args) {
        int processors = Runtime.getRuntime().availableProcessors();
        System.out.println(Integer.toString(processors) + " processor"
                + (processors != 1 ? "s are " : " is ")
                + "available");

        int arr[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
        t test=new t(arr);

        ForkJoinPool pool = new ForkJoinPool();

        long startTime = System.currentTimeMillis();
        pool.invoke(test);
        long endTime = System.currentTimeMillis();

        System.out.println("Takes " + (endTime - startTime) + 
                " milliseconds.");

    }

}

您正在为每个任务创建一个新数组。 虽然这些新数组的内容设置为与输入数组中的相同,但更改这些数组中的值不会影响输入数组中的值。

您必须确保所有任务仅适用于INPUT阵列。 任务仅在他们关心的输入数组的元素上有所不同。 在此示例中,每个任务正在处理的范围由'min'和'max'指定:

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;

public class Nt {
    public static void main(String[] args) {
        int processors = Runtime.getRuntime().availableProcessors();
        System.out.println(Integer.toString(processors) + " processor"
            + (processors != 1 ? "s are " : " is ")
            + "available");

        int arr[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
        t test=new t(arr);

        ForkJoinPool pool = new ForkJoinPool();

        long startTime = System.currentTimeMillis();
        pool.invoke(test);
        long endTime = System.currentTimeMillis();

        System.out.println("Takes " + (endTime - startTime) + 
            " milliseconds.");

    }
}
class t extends RecursiveAction{


    private final int array[];
    private final int min;
    private final int max;
    private final int th=4;

    public t (int array[]){
        this(array, 0, array.length);
    }

    public t (int array[], int min, int max){
        this.array=array;
        this.min = min;
        this.max = max;

        System.out.println("Task to handle range "+min+" to "+max);
    }

    protected void compdir(){

        for (int i=min;i<max;i++){
            array[i]=array[i]+3;
        }
    }

    @Override
    protected void compute(){
        if (max-min<th) {      
            compdir();
        } else {

            int center = min + (max - min) / 2;
            invokeAll(new t(array, min, center) , new t(array, center+1, max));
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM