2016-04-15 80 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); 
    } 
} 

另外:

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

對''end'使用1000而不是999.或者用'(array,middle + 1,end)'開始第二個任務,並在循環中使用'i <= end'。 – AJNeufeld

回答

0

的ForkJoin任務真正開始去之前,您的Java程序退出。在啓動後,您需要使用invoke而不是execute來「完成」任務。

pool.invoke(st); 
相關問題