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

59
10

Другой серийный код, который я написал, работает отлично, но эта параллельная версия не дает никакого вывода, она просто печатает привет, я тестирую ее с помощью "эй", она никогда не попадает в эту строку, т.е. Она застревает в методе invoke, t найти полезные ресурсы в Интернете.

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

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

y [1] = медиана [2 2 80] = 2

y [2] = медиана [2 80 6] = медиана [2 6 80] = 6

y [3] = медиана [80 6 3] = медиана [3 6 80] = 6

y [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){}

}

}

спросил(а) 2015-08-10T17:07:00+03:00 5 лет, 2 месяца назад
1
Решение
58

Если вы наберете "эй" при запуске этой программы, вы получите синтаксический разбор, который игнорируется из-за пустого блока 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(" ");

ответил(а) 2015-08-10T17:40:00+03:00 5 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема