2016-04-15 9 views
0

Ich lerne gerade über Java ForkJoinPool. Ich habe ein kleines Beispiel für mich geschaffen, um ein besseres Verständnis zu erreichen. Ich erwarte, dass der Code, den ich geschrieben habe, eine Ausgabe erzeugt, aber ich sehe nichts im Konsolenfenster. Es gibt keine Fehler, daher kann es sein, dass ich missverstanden habe, wie dieser Service genutzt wird. Bitte ignorieren Sie Methodennamen, die anscheinend nicht genau beschreiben, was die Methode macht. Das ist immerhin ein Scratch-Code.Java ForkJoinPool nicht das tun, was ich erwarte

import java.util.concurrent.RecursiveAction; 

public class SortTask extends RecursiveAction { 
    final int THRESHOLD = 10; 
    int[] array; 
    int begin, end; 

    public SortTask(int[] array, int begin, int end) { 
     this.array = array; 
     this.begin = begin; 
     this.end = end; 
    } 

    @Override 
    protected void compute() { 
     if((end - begin) < THRESHOLD) { 
      for(int i = 0; i < array.length; i++) { 
       System.out.println(i); 
       array[i] = i; 
      } 
     } else { 
      int middle = (end - begin)/2; 
      invokeAll(new SortTask(array, begin, middle), new SortTask(array, begin, middle)); 
      merge(array, begin, end); 
     } 
    } 

    public void merge(int[] array, int begin, int end) { 
     System.out.println(array.length); 
    } 
} 

auch:

import java.util.concurrent.ForkJoinPool; 

    public class Main { 

     public static void main(String[] args) { 
      System.out.println(Runtime.getRuntime().availableProcessors()); 
      int[] list = new int[1000]; 
      SortTask st = new SortTask(list, 0, 999); 
      ForkJoinPool pool = new ForkJoinPool(); 
      pool.execute(st); 
     } 
    } 
+0

Ziemlich sicher, dass Sie 'Mitte, end' für den zweiten Teil dieses:' invokeAll (neu SortTask (array, beginnen, Mitte), neue SortTask (array, beginnen, Mitte)); ' – AJNeufeld

+0

Wahrscheinlich wollen 'int i = beginne; i AJNeufeld

+0

Verwenden Sie 1000 für "end" anstelle von 999. Oder starten Sie die zweite Aufgabe mit "(array, middle + 1, end)" und verwenden Sie "i <= end" in Ihren Loops. – AJNeufeld

Antwort

0

Ihr Java-Programm zu beenden, bevor die ForkJoin Aufgabe wirklich beginnt gehen. Sie müssen warten, bis die Aufgabe abgeschlossen ist, indem Sie invoke anstelle von execute verwenden.

pool.invoke(st); 
Verwandte Themen