Пул Fork-Join не дает никакого результата, тогда как последовательные коды работают оптимально

Другой последовательный код, который я написал, работает отлично, но эта параллельная версия не дает никакого вывода, она просто печатает привет, я тестирую ее с помощью «эй», она даже не доходит до этой строки, т.е. она застревает в методе вызова, я не мог найти любые полезные ресурсы в Интернете.

Пожалуйста, помогите мне понять, где я ошибаюсь, я новичок в параллельном программировании.

Код представляет собой программу медианного фильтра, которая при задании массива x=[2,80,6,3] отфильтрованного массива y=[2,6,6,3] рассчитывается как:

у[1] = Медиана[2 2 80] = 2

у[2] = Медиана[2 80 6] = Медиана[2 6 80] = 6

у[3] = Медиана[80 6 3] = Медиана[3 6 80] = 6

у[4] = Медиана[6 3 3] = Медиана[3 3 6] = 3

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
import java.io.PrintWriter;

public class ParallelFilter extends RecursiveAction {

static final int SEQUENTIAL_THRESHOLD=500; 
ArrayList<Float> inputArray;
int sizeOfFilter;
ArrayList<Float> outputlist;
ArrayList<Float> arrayFiltered;

float high;
float low;

public ParallelFilter(ArrayList<Float> inputArray,int sizeOfFilter,float           high,float low)
                 {
  
  this.inputArray=inputArray;
   this.outputlist=outputlist;
  this.sizeOfFilter=sizeOfFilter;
  this.arrayFiltered=arrayFiltered;
  //this.index=index;
  this.high=high;
  this.low=low;
 }




 protected void compute()
 {
  int index=1;
  
  if((high - low) < SEQUENTIAL_THRESHOLD )
  {
      while(inputArray.size() > sizeOfFilter){
     for(int i=0; i<sizeOfFilter;i++){
        
         arrayFiltered.add(i,inputArray.get(i));
         
     }
     
         Collections.sort(arrayFiltered);
         float median = arrayFiltered.get(arrayFiltered.size()/2);
         outputlist.add(index,median);
         inputArray.remove(inputArray.get(0));
         arrayFiltered.clear();
         index=index+1;
      
      }
      
      outputlist.add(inputArray.get(inputArray.size()-1));
  }
  
  
    else{
      
      ParallelFilter leftTask = new       ParallelFilter(inputArray,sizeOfFilter,low,(low+high)/2);
      ParallelFilter rightTask = new ParallelFilter(inputArray,sizeOfFilter,(low+high)/2,high);
      leftTask.fork();
      rightTask.compute();
      leftTask.join();
  }
  
  }



   public static void main(String[] args){
  
  try
  {
      Scanner sc;
      sc = new Scanner(new File("inp1.txt"));
      sc.useDelimiter(" ");
      ArrayList<Float> inputlist = new ArrayList<>();
      
      //POPULATE LIST FROM FILE
      while (sc.hasNextLine()) {
          
      if(sc.nextLine().length() == 1){continue;}
      String[] parts = sc.nextLine().split(" "); // split each line by " "
 
      inputlist.add(Float.parseFloat(parts[1]))  ; 
      // System.out.println(parts[1]);
                           }
    
      System.out.println("Enter filter size : ");
      Scanner in = new Scanner(System.in);
      int sizeOfFilter = in.nextInt();
      if (sizeOfFilter < 3 || sizeOfFilter / 2 == 0) {
             System.out.println("Filter size should be odd and bigger than 3");
         }
      
      float low = inputlist.get(0);
      float high = inputlist.get(inputlist.size()-1);
      
      ParallelFilter pf = new ParallelFilter(inputlist,sizeOfFilter,low,high);
      System.out.println("hello");
      ForkJoinPool forkJoinPool = new ForkJoinPool();
      forkJoinPool.invoke(pf);//suspect the problem is here...
      
      for (int i=0; i<pf.outputlist.size();i++){
          
      System.out.println(pf.outputlist.get(i));}
      System.out.println("hey");
      
    }
  catch(Exception e){}
  
 }



  }

person Thabang Bhili    schedule 10.08.2015    source источник
comment
Что находится в inp1.txt?   -  person talex    schedule 10.08.2015
comment
Это файл с общим количеством строк вверху и данными, начинающимися со строки 2 с числами с плавающей запятой, например: 12343 (общее количество строк), затем в следующей строке 2 6574,76 и т. д.   -  person Thabang Bhili    schedule 10.08.2015
comment
Я не вижу в вашем коде, где вы читаете общее количество строк из вашего файла.   -  person talex    schedule 10.08.2015
comment
Мне это не нужно, поэтому я говорю, что когда сканер считывает/достигает один токен, который находится в первой строке, тогда он должен продолжаться.   -  person Thabang Bhili    schedule 10.08.2015


Ответы (1)


Если вы наберете «привет» при запуске этой программы, вы получите исключение синтаксического анализа, которое будет проигнорировано из-за пустого блока catch.

Также в вашем конструкторе у вас есть this.arrayFiltered = arrayFiltered;, который на самом деле ничего не делает, потому что у вас нет параметра с именем arrayFiltered. Это приведет к тому, что arrayFiltered не будет инициализирован, что приведет к NPE в arrayFiltered.add(i, inputArray.get(i));

Я предлагаю вам поставить e.printStackTrace(); в блок catch, он сразу покажет все ошибки. И, конечно же, вам нужно научиться пользоваться отладчиком.

Также эта часть

            if (sc.nextLine().length() == 1) {
                continue;
            }
            String[] parts = sc.nextLine().split(" ");

неправильно. потому что вы читаете две строки здесь. Вам нужно прочитать строку один раз, запомнить результат, затем проверить его и разобрать.

Как это

            String line = sc.nextLine();
            if (line.length() == 1) {
                continue;
            }
            String[] parts = line.split(" ");
person talex    schedule 10.08.2015
comment
спасибо, я исправил исключения нулевого указателя в методе вычисления и закомментировал arrayFiltered внутри конструктора, но я получаю NPE в своем основном методе, где я вызываю список вывода из метода вычисления для печати, я понимаю, что метод вычисления void, и поэтому я не могу помещать операторы возврата, так как же мне получить доступ к этому выходному списку, который мне так нужен? - person Thabang Bhili; 10.08.2015
comment
Я читаю размер списка вывода внутри цикла for в моем основном методе. - person Thabang Bhili; 10.08.2015
comment
Если у вас есть новый вопрос, разместите его как новый. Тогда любой может ответить не только я. - person talex; 10.08.2015