2016-04-15 4 views
0

私はJavaのForkJoinPoolについて学んでいます。より良いレベルの理解を得るために、私は自分自身のための小さな例を作りました。私は、出力を生成するために書いたコードを期待していますが、コンソールウィンドウに何も表示されません。エラーはないので、このサービスの使い方を誤解している可能性があります。メソッドが何をしているのかを正確に記述していないメソッド名は無視してください。これは結局のところスクラッチコードです。またJava ForkJoinPoolは私が期待したことをしていません

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); 
    } 
} 

ForkJoinタスクが実際に起こって開始する前に、あなたのJavaプログラムが終了している
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

したいかなり確信して 'ミドル、この第二の部分のためのend':' invokeAll(新しいSortTask(配列、開始、中央)、新しいSortTask(配列、開始、真ん中)); 'は – AJNeufeld

+0

はおそらくしたいです'int i = begin;ここでは 'for(int i = 0; i AJNeufeld

+0

999ではなく 'end'に1000を使用するか、'(array、middle + 1、end) 'で2番目のタスクを開始し、ループで' i <= end'を使用します。 – AJNeufeld

答えて

0

。タスクが完了した後に、の代わりにinvokeを使用して、タスクの完了後に「待機」する必要があります。

pool.invoke(st); 
関連する問題