2015-04-03 42 views
1

我正在刷新我在Java中的多線程技能並實現了這個簡單的劃分&征服方法在列表中查找最大元素,使用來自java.util.concurrent.ForkJoinTask的RecursiveTaskJava多線程 - 使用Fork-Join方法在列表中查找最大元素

public static void main(String[] args){ 
    new Multithreading().compute(); 
} 

public void compute(){ 
    Integer[] ints = {3,2,5,7,1}; 
    List<Integer> list = Arrays.asList(ints); 

    ForkJoinPool pool = new ForkJoinPool(); 
    Integer result = pool.invoke(new DividerTask(list)); 
    System.out.println(result); 
} 

class DividerTask extends RecursiveTask<Integer>{ 
    List<Integer> list; 

    public DividerTask(List list){ 
     this.list = list; 
    } 
    @Override 
    protected Integer compute(){ 
     if(list.size() > 2){ 
      int mid = list.size()/2; 
      List<Integer> list1 = list.subList(0,mid); 
      List<Integer> list2 = list.subList(mid,list.size()); 

      DividerTask dt1 = new DividerTask(list1); 
      dt1.fork(); 

      DividerTask dt2 = new DividerTask(list2); 
      dt2.fork(); 

      Integer res1 = dt1.join(); 
      Integer res2 = dt2.join(); 

      return (res1 > res2 ? res1 : res2); 
     } 

     if(list.size() == 2){ 
      Integer res1 = list.get(0); 
      Integer res2 = list.get(1); 

      return (res1 > res2 ? res1 : res2); 
     } 

     return list.get(0); 
    } 
} 

你會如何處理這個問題?你會考慮哪些其他多線程解決方案?

+0

爲什麼你想要另一種解決方案? – Bram 2015-04-03 11:16:16

+0

CodeReview.SE會更好嗎? – Rich 2015-04-03 14:46:32

+0

@Rich如果它在這裏關閉,那麼是的。如果沒有,那麼它在這裏和Code Review一樣好。 – 2015-04-03 14:59:09

回答

3

按照例如RecursiveTask:

dt1.fork() 
return dt2.compute() + dt1.join() 

雙連接()你正在做的結果在這兩個計算等。使用dt2.compute()強制當前線程繼續移動。

+0

好的,在你的解決方案中,主線程將計算dt2並等待(連接)dt1,對吧? – Shady 2015-04-06 06:16:00

+0

@Shady實際上,線程繼續沿着dt2的鏈條前進,直到它到達不再發生分裂的底部。 – edharned 2015-04-06 13:56:49

相關問題