[英]Fork-Join Pool not producing any result whereas the serial codes works optimally
我編寫的其他串行代碼運行完美,但是此並行版本沒有提供任何輸出,它只會打印問候,我正在用“嘿”測試它,甚至從未到達該行,即卡在invoke方法上,我無法找不到在線有用的資源。
請幫助我了解我要去哪里錯了,我是並行編程的新手。
該代碼是一個中值濾波程序,當給定數組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){}
}
}
如果在運行該程序時鍵入“ hey”,則會得到解析異常,由於catch
塊為空,該異常被忽略。
同樣在您的構造函數中,您有this.arrayFiltered = arrayFiltered;
實際上沒有任何作用,因為您沒有名稱為arrayFiltered的參數。 它導致arrayFiltered
不會被初始化,從而導致arrayFiltered.add(i, inputArray.get(i));
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(" ");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.