【问题标题】:Parallel Programming Assignment in javajava中的并行编程作业
【发布时间】:2013-09-16 11:16:58
【问题描述】:

我正忙于并行编程任务,我真的被困住了。老实说,我不完全确定每种方法的工作原理,但我想我有一个想法。

我需要对一组连续值求和(并行)。似乎很容易,但每次尝试时我都会得到 0 作为答案。我真的不知道为什么。

class SumThreaded extends RecursiveTask<Integer> {
    static int SEQUENTIAL_THRESHOLD = 10000;
    double lo=0.0;
    double hi=0.0;

    long[] arr;

    public SumThreaded(long[] array, double a, double b) {
        arr=array;
        lo=a;
        hi=b;


    }

    public Integer compute() {

        //System.out.println(mid);
        if(hi - lo <= SEQUENTIAL_THRESHOLD) {
            int ans = 0;
            for(int i= (int) lo; i < hi; ++i)
                ans += arr[i];
            return ans;
        }
        else {
            SumThreaded left = new SumThreaded(arr,lo,(hi+lo)/2.0);
            SumThreaded right = new SumThreaded(arr,(hi+lo)/2.0,hi);
            left.fork();
            int rightAns = right.compute();
            int leftAns = left.join();
            return leftAns+rightAns;

        }
    }


    public static void main(String args[]){

        int size = 1000000;
        long [] testArray=new long[size]; 

        for(int i=0;i<size;i++){
            testArray[i]=i+1;
        }

        SumThreaded t = new SumThreaded(testArray,0.0,testArray.length); 
        ForkJoinPool fjPool = new ForkJoinPool();
        int result =fjPool.invoke(t);
        System.out.println(result);

    }
}

任何帮助将不胜感激。

【问题讨论】:

  • 首先,正确地格式化您的代码可以更容易阅读和调试。
  • 这似乎是一个完整的代码,只需要几行代码。尝试将您的关注点分开,以便每个班级尽其所能。
  • 啊!你对格式做了什么?

标签: java parallel-processing


【解决方案1】:

您的问题似乎是SumThreaded 有两个单独的构造函数,其中只有一个设置了类的字段。当您从new 中的sumArray 中输入long[] array 时,您将数组扔掉。您需要选择是使用ints 还是longs(大数组的总和可能需要long),然后确保您的值设置得当。在 compute 上调试和设置断点会告诉你这一点。

【讨论】:

  • 对此我感到非常抱歉,我完全错过了那个额外的构造器(已经很晚了:P)。我编辑了 OP,但我得到了 ClassCastException。
  • 哪个 ClassCastException?它会打印出大量详细信息,通常可以准确地告诉您问题出在哪里以及问题出在哪里。
  • 线程 "main" java.lang.ClassCastException 中的异常:java.lang.Thread cannot be cast to java.util.concurrent.ForkJoinWorkerThread at java.util.concurrent.ForkJoinTask.fork(Unknown Source) at SumThreaded.compute(SumThreaded.java:24) at Main.sumArray(SumThreaded.java:36) at Main.main(SumThreaded.java:49)code` 我真的不熟悉 fork/join 框架:/
  • 感谢西奥多,我再次编辑了 OP,但现在它是一个逻辑错误(答案是错误的)
猜你喜欢
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多