[英]Difference between ForkJoinPool and normal ExecutionService?
[英]Difference between Execute , Submit and Invoke() in a ForkJoinPool
我有以下運行和編譯的類(你可以嘗試一下)。 唯一令我困惑的是,在主要結尾它與fj.invoke(任務)一起工作正常,但它沒有fj.execute(task)和fj.submit(task)。 我沒有得到后者的任何輸出。 從API開始,它也應該與其他方法一起執行任務..即使它們返回或不返回值,它們仍然應該執行任務。 我在這里錯過了什么?
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.ForkJoinPool;
public class RecursiveTaskActionThing extends RecursiveAction{
int roba;
static int counter;
public RecursiveTaskActionThing(int roba)
{
this.roba = roba;
}
public void compute()
{
if (roba<100)
{
System.out.println("The thing has been split as expected: "+ ++counter );
}
else{
roba = roba/2;
RecursiveTaskActionThing rc1 = new RecursiveTaskActionThing(roba);
RecursiveTaskActionThing rc2 = new RecursiveTaskActionThing(roba);
this.invokeAll(rc1,rc2);
}
}
public static void main (String []args)
{
ForkJoinPool fj = new ForkJoinPool();
fj.invoke(new RecursiveTaskActionThing(500));
}
}
您只需復制並粘貼代碼即可通過替換來試用
fj.invoke(new RecursiveTaskActionThing(500));
同
fj.execute(new RecursiveTaskActionThing(500));
或者
fj.submit(new RecursiveTaskActionThing(500));
它不會吐出任何輸出......我想知道為什么。
提前致謝。
根據您的上一個問題,了解如何閱讀其他代碼以獲取此類特定問題對您來說真的很有用。
但無論如何。 invoke
將執行並加入該任務。 execute
和submit
會將任務推送到工作隊列以便稍后處理。 如果要查看預期的輸出,請在submit
或execute
后調用任務的join
方法。
現在最后一個問題應該是'為什么這項任務根本不會運行?' 線程創建為setDaemon(true)
,因此當您離開main
方法時,主線程將死亡。 並且由於規范指定只有守護程序線程運行時系統將退出。
通過加入任務,您將掛起主線程,直到fork join任務完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.