2014-01-05 29 views
0

嘿家伙我需要一些帮助,我的作业。我了解Fork和Join Framework的工作方式,但我的代码并未加入结果。我们的练习是编写一个程序,计算数组中的真实值。对不起,在这篇文章中有任何错误(错误的语法或其他),这是我的第一个错误。叉和加入Java

编辑: 感谢这里所有的请求是我这个问题的解决方案: TrueFinder类:

import java.util.concurrent.ForkJoinPool; 
import java.util.concurrent.RecursiveTask; 

class TrueFinder extends RecursiveTask<TrueResult> 
{ 

    private static final int SEQUENTIAL_THRESHOLD = 5; 

    private boolean[] trueData; 

    private final int start; 

    private final int end; 

    public TrueFinder(boolean[] data, int start, int end) 
    { 
     this.trueData = data; 
     this.start = start; 
     this.end = end; 
    } 

    public TrueFinder(boolean[] data) 
    { 
     this(data, 0, data.length); 
    } 

    protected TrueResult compute() 
    { 
     final int length = end - start; 
     int counter = 0; 
     if (length < SEQUENTIAL_THRESHOLD) 
     { 
      for (int i = start; i < end; i++) 
      { 
       if (trueData[i]) 
       { 
        counter++; 
       } 
      } 
      return new TrueResult(counter); 
     } 
     else 
     {    
      final int split = length/2; 
      TrueFinder left = new TrueFinder(trueData, start, start + split); 
      left.fork(); 
      TrueFinder right = new TrueFinder(trueData, start + split, end); 

      TrueResult subResultRight = right.compute(); 
      TrueResult subResultLeft = left.join(); 
      return new TrueResult(subResultRight.getTrueCounter() + 
      subResultLeft.getTrueCounter());   
     } 
    } 


    public static void main(String[] args) 
    { 
     int trues = 0; 
     boolean[] trueArray = new boolean[500]; 
     for (int i = 0; i < 500; i++) 
     { 
      if (Math.random() < 0.3) 
      { 
       trueArray[i] = true; 
       trues++; 
      } 
      else 
      { 
       trueArray[i] = false; 
      } 
     } 

     TrueFinder finder = new TrueFinder(trueArray); 
     ForkJoinPool pool = new ForkJoinPool(4); 

     long startTime = System.currentTimeMillis(); 
     TrueResult result = pool.invoke(finder); 
     long endTime = System.currentTimeMillis(); 
     long actualTime = endTime - startTime; 

     System.out.println("Array mit der Länge " + trueArray.length + " in" 
     actualTime + " msec dursucht und " + result.getTrueCounter() + 
     " von " + trues + " True Werten gefunden."); 
    } 
} 

而且结果类:

public class TrueResult 
{ 
    private int trueCounter; 

    public TrueResult(int counter) 
    { 
     this.trueCounter = counter; 
    } 

    public int getTrueCounter() 
    { 
     return trueCounter; 
    } 
} 
+0

没有你的老师知道你正在帮助做功课? – Buddha

+0

没有。它的作业。 –

+0

请格式化您的代码,这是难以辨认的。此外,它不会编译,因为我看到至少有一个缺失的'{'。 –

回答

0

你烃源代码分裂任务错误为:
(1)您的拆分不是从0开始的:
您的开头为1
(2)分数点被忽略;
(授予SEQUENTIAL_THRESHOLD = 5且trueArray.length = 13,您的拆分将忽略数字从11到12)
(3)如果您修改了(1)和(2),子任务的长度必须为拆分不SQCUQNTIALTHRESHOLD。

因此,修改源代码如下:

else 
{ 
    int split = (length - 1)/SEQUENTIAL_THRESHOLD + 1; 
    TrueFinder[] subtasks = new TrueFinder[split]; 
    int start = 0; 
    for(int i = 0; i < split - 1; i++) 
    { 
     subtasks[i] = new TrueFinder(trueData, start, start + SEQUENTIAL_THRESHOLD); 
     subtasks[i].fork(); 
     start += SEQUENTIAL_THRESHOLD; 
    } 
    subtasks[split - 1] = new TrueFinder(trueData, start, length); 
    counter = subtasks[split - 1].compute();// better invoking compute than join 
    for (int i = 0; i < SEQUENTIAL_THRESHOLD; i++) 
    { 
     counter += subtasks[i].join(); 
    } 
    return new TrueResult(counter); 
}