ExecutorService 接口通过添加有助于管理和控制线程执行的方法来扩展 Executor。它在 java.util.concurrent 包中定义。它定义了执行返回结果的线程、一组线程并确定关闭状态的方法。在本文中,我们将看到这两种称为 execute()submit() 的方法之间的区别。

在Java中,为了执行异步任务,实现了runnable接口。为了做到这一点,一个可用的接口是 Executor 接口。executor 接口包含 execute() 方法。除此之外,还有另一个可用的接口是 ExecutorService 接口,它扩展了 executor 接口。该接口包含 submit() 方法。下图说明了这两个接口之间的关系。
Java中ExecutorService execute()和submit()方法的区别

execute()方法:此函数在将来的某个时间执行给定的命令。根据 Executor 实现的判断,该命令可以在新线程、池线程或调用线程中执行。此方法是一个 void 方法,这意味着它不返回任何函数。一旦在 execute() 方法中分配了任务,我们将不会得到任何响应。下面是execute方法的一个实现。

import java.util.concurrent.*;
public class YiibaiDemo {

    public static void main(String[] args)
        throws Exception
    {

        // Creating the object of the
        // Executor Service
        ExecutorService executorService = Executors.newSingleThreadExecutor();

        // By using execute(), we are accepting
        // a Runnable task
        executorService.execute(new Runnable() {
            // Override the run method
            public void run()
            {
                System.out.println("This is execute() method example");
            }
        });
        executorService.shutdown();
    }
}

submit()方法: 此函数在将来的某个时间执行给定的命令。根据 Executor 实现的判断,该命令可以在新线程、池线程或调用线程中执行。与 execute 方法不同,此方法返回一个未来。在 Java 中,future 代表异步计算的结果。未来对象用于在执行开始后处理任务。因此,当需要执行结果时,可以使用future对象的submit()方法。为了得到结果,可以使用 Future 的 get() 方法。get() 方法返回一个对象,如果在任务完成之前调用 get() 方法,它将阻塞直到结果准备好并可能抛出检查异常,或者如果任务完成,那么未来对象会保存一个结果 被返回,以后可以使用。下面是提交方法的一个实现:

// Java program to demonstrate the behavior of the submit() method

import java.util.concurrent.*;
public class YiibaiDemo {
    public static void main(String[] args)
        throws Exception
    {
        // Creating the object of the Executor service interface
        ExecutorService executorService = Executors.newFixedThreadPool(1);
        // By using submit(), we are
        // accepting a Callable task
        Future obj
            = executorService.submit(new Callable() {

                // Overriding the call method
                public Object call()
                {
                    System.out.println("This is submit() method example");

                    return "Returning Callable Task Result";
                }
            });

        System.out.println(obj.get());
        executorService.shutdown();
    }
}

下表演示了execute()方法和submit()方法的区别:

execute()方法 submit()方法
execute()方法方法在 Executor 接口中声明。 submit()方法在 ExecutorService 接口中声明。
execute()方法只能接受可运行的任务。 submit()方法可以接受可运行和可调用的任务。
execute()方法的返回类型为 void submit()方法的返回类型为 Future

当我们不关心结果但希望代码由线程池的工作线程并行运行时,使用此方法。当我们关心结果并从已执行的任务中需要它时使用此方法。