簡體   English   中英

ForkJoinPool中Execute,Submit和Invoke()之間的區別

[英]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將執行並加入該任務。 executesubmit會將任務推送到工作隊列以便稍后處理。 如果要查看預期的輸出,請在submitexecute后調用任務的join方法。

現在最后一個問題應該是'為什么這項任務根本不會運行?' 線程創建為setDaemon(true) ,因此當您離開main方法時,主線程將死亡。 並且由於規范指定只有守護程序線程運行時系統將退出。

通過加入任務,您將掛起主線程,直到fork join任務完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM