Java中ExecutorService execute()和submit()方法的区别

Java中ExecutorService execute()和submit()方法的区别

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 geekdocsDemo {

    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();
    }
}

输出:

Java中ExecutorService execute()和submit()方法的区别

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 geekdocsDemo {
    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();
    }
}

输出:

Java中ExecutorService execute()和submit()方法的区别

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

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

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程