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

Rol*_*all 11 java methods concurrency fork-join

我有以下运行和编译的类(你可以尝试一下).唯一令我困惑的是,在主要结尾它与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));
}
}
Run Code Online (Sandbox Code Playgroud)

您只需复制并粘贴代码即可通过替换来试用

fj.invoke(new RecursiveTaskActionThing(500));

fj.execute(new RecursiveTaskActionThing(500)); 或者

fj.submit(new RecursiveTaskActionThing(500)); 它不会吐出任何输出......我想知道为什么.

提前致谢.

Joh*_*int 16

根据您的上一个问题,了解如何阅读其他代码以获取此类特定问题对您来说真的很有用.

但无论如何.invoke将执行并加入该任务. execute并将submit任务推送到工作队列以便稍后处理.如果你想看到预期的输出调用join后任务的方法submit荷兰国际集团和execute荷兰国际集团.

现在最后一个问题应该是'为什么这项任务根本不会运行?' 线程被创建为setDaemon(true),所以当你离开你的main方法时,主线程就会死掉.并且由于规范指定只有守护程序线程运行时系统将退出.

通过加入任务,您将挂起主线程,直到fork join任务完成.

  • @MKod根据定义,如果主线程是守护进程,那么应用程序将不会运行.主线程将始终是第一个线程运行(这意味着唯一的线程运行).如果它是守护进程,那么它会立即被杀死.所以要回答你的问题,主线程不是守护程序线程.您看到的`IllegalStateException`是因为必须在启动线程之前设置守护程序标志.通过将其设置为`currentThread().setDaemon(true)`,线程已经运行并且将失败. (5认同)