2014-01-05 3 views
0

Эй, ребята, мне нужна помощь с моей домашней работой. Я понимаю, как работает Fork и Join Framework, но мой код не присоединяется к результатам. Наше упражнение - написать программу, которая учитывает истинные значения в массиве. Извините за любые ошибки (плохая грамматика или что-то еще) в этом посте, это мой первый.Вилка и присоединение к Java

Edit: Спасибо за все запросы здесь мое решение этой проблемы: 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); 
} 
Смежные вопросы