Java中ExecutorService execute()和submit()方法的区别
ExecutorService
接口通过添加有助于管理和控制线程执行的方法来扩展 Executor
。它在 java.util.concurrent
包中定义。它定义了执行返回结果的线程、一组线程并确定关闭状态的方法。在本文中,我们将看到这两种称为 execute()
和 submit()
的方法之间的区别。
在Java中,为了执行异步任务,实现了runnable
接口。为了做到这一点,一个可用的接口是 Executor
接口。executor
接口包含 execute()
方法。除此之外,还有另一个可用的接口是 ExecutorService
接口,它扩展了 executor
接口。该接口包含 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();
}
}
输出:
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();
}
}
输出:
下表演示了execute()
方法和submit()
方法的区别:
execute() 方法 |
submit() 方法 |
---|---|
execute() 方法方法在 Executor 接口中声明。 |
submit() 方法在 ExecutorService 接口中声明。 |
execute() 方法只能接受可运行的任务。 |
submit() 方法可以接受可运行和可调用的任务。 |
execute() 方法的返回类型为 void 。 |
submit() 方法的返回类型为 Future 。 |
当我们不关心结果但希望代码由线程池的工作线程并行运行时,使用此方法。当我们关心结果并从已执行的任务中需要它时使用此方法。