2017-04-06 83 views
6

假設我有一個ForkJoinPool設置與並行度n的程度,那我叫並行計算是這樣的:ForkJoinPool和的Future.get

workpool.submit(
      () -> { 
        objects.values().parallelStream().forEach(obj -> { 
         obj.foo(); 
        }); 
       }); 

我這樣做是爲了確保線程催生有創建在工作區內(我有需要隔離的系統的不同組件)。現在假設在這個被稱爲線程,也是本workpool內部執行,而我呢:

Future<?> wait = workpool.submit(
      () -> { 
        objects.values().parallelStream().forEach(obj -> { 
         obj.foo(); 
        }); 
       }); 
wait.get() 

1)我是不是堵在ForkJoinPool一個線程?如果我有n個線程全部阻塞未來,同時試圖在工作區中安排任務,這是否會導致死鎖?我不清楚ForkJoinPool中的「最大並行度」是否意味着(如果有n個非阻塞的任務),總會有n個線程執行,或者是否有固定數量的線程,無論是否有阻塞。如果我使用wait.join()而不是wait.join(我不需要檢查異常,因爲在此代碼中引發的任何異常都已經生成了runtimeexception。如果我理解正確,join()將允許線程在等待時執行排隊的任務)

2)我仍然這樣做()獲得重量輕的優點forkjoin並行流的任務,如果我創建一個可運行的「包裝」類 - > {}

3)是否有任何(假設.join()確實實現了我認爲它的工作竊取行爲):

 CompletableFuture.supplyAsync(this::mylambdafunction, workpool) 
      .thenAccept(this::mynextfunction); 

回答

1

對第1點的迴應:很難知道您的代碼是否會在沒有看到實際方法實現的情況下阻塞。處理阻塞代碼的一種方法是增加forkjoin線程池中的線程數。通常,對於計算密集型任務(其中n =處理器數量),forkjoin線程中的線程數爲n + 1。或者如果你有I/O阻塞,你可以使用ManagedBlocker。

響應指向2:爲3點是

響應:明顯的上攻您completableFuture代碼是,thenAccept是非阻塞。因此,控制權會立即通過您的CompletableFuture塊到達下一條語句而無需等待,而在您使用ForkJoin池寫入的早期代碼中,wait.get()將會阻塞,直到您獲得答案爲止,直到此時纔會繼續。

相關問題