ForkJoinPool 中的 Execute 、 Submit 和 Invoke() 之间的区别

2022-09-03 01:20:15

我有以下运行和编译的类(你可以尝试一下)。唯一让我有点困惑的是,在主要的最后,它与fj.invoke(task)一起工作得很好,但它与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));它不会吐出任何输出...我想知道为什么。

提前致谢。


答案 1

根据你的最后一个问题,学习如何阅读其他代码来回答像这样的特定问题,对你来说确实是有益的。

但无论如何。 将执行并加入该任务。 并将任务推送到工作队列以便稍后处理。如果要查看预期的输出,请在 ing 或 ing 后调用任务的方法。invokeexecutesubmitjoinsubmitexecute

现在最后一个问题应该是,“为什么任务根本无法运行?线程创建为 ,因此当您离开方法时,主线程将死亡。正如规范所指定的那样,当只有守护进程线程在运行时,系统将退出。setDaemon(true)main

通过加入任务,您将挂起主线程,直到分叉连接任务完成。


答案 2

推荐