网站首页 > 技术文章 正文
1、execute和submit的区别
提交任务的类型:
execute和submit都属于线程池的方法,execute只能提交Runnable类型的任务
submit既能提交Runnable类型任务也能提交Callable类型任务。
异常:
execute会直接抛出任务执行时的异常,可以用try、catch来捕获,和普通线程的处理方式完全一致
submit会吃掉异常,可通过Future的get方法将任务执行时的异常重新抛出。
返回值:
execute()没有返回值
submit有返回值,所以需要返回值的时候必须使用submit
2、对execute和submit 的API理解
首先看看java api对两个方法的描述
execute() 是在Executor接口中定义的,ThreadPoolExecutor继承了AbstractExecutorService抽象类,该抽象类实现了ExecutorService接口(但并没有覆盖execute方法),而ExecutorService接口继承了Executor接口。
总觉:就是说ThreadPoolExecutor实现了execute()方法。然后我们来看看api文档对execute()方法是如何定义的:
execute public void execute(Runnable command)
在将来某个时间执行给定任务。可以在新线程中或者在现有池线程中执行该任务。如果无法将任务提交执行,或者因为此执行程序已关闭,或者因为已达到其容量,则该任务由当前 RejectedExecutionHandler处理。
参数: command - 要执行的任务。 抛出: RejectedExecutionException -
如果无法接收要执行的任务,则由 RejectedExecutionHandler 决定是否抛出
RejectedExecutionException NullPointerException - 如果命令为 null
submit方法是ExecutorService接口里面定义的,具体的实现由AbstractExecutorService进行。
submit方法被重载了三次,分别对用三个不同的参数。对api摘录如下:
(1)submit public Future<?> submit(Runnable task)
提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该Future的get方法在成功完成时将会返回null。
指定者:接口 ExecutorService 中的 submit 参数:task - 要提交的任务 返回:表示任务等待完成的 Future
---------------------------------------------------------------------------------------
(2)submit public Future submit(Runnable task,T result) 提交一个
Runnable 任务用于执行,并返回一个表示该任务的Future。该Future的get方法在成功完成时将会返回给定的结果。
指定者:接口 ExecutorService 中的submit参数:task - 要提交的任务 result - 返回的结果
返回: 表示任务等待完成的 Future
-----------------------------------------------------------------------------------------
(3)submit public Future submit(Callable task)
提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。该 Future 的 get
方法在成功完成时将会返回该任务的结果。 如果想立即阻塞任务的等待,则可以使用 result =
execute.submit(aCallable).get(); 形式的构造。
-----------------------------------------------------------------------------------------
注:Executors 类包括了一组方法,可以转换某些其他常见的类似于闭包的对象,例如,将 PrivilegedAction 转换为Callable 形式,这样就可以提交它们了。
指定者:接口 ExecutorService中的submit参数task - 要提交的任务 返回: 表示任务等待完成的Future
API中的(2)(3)就是说execute不支持Future那一套 来接收多线程的执行结果 ,而submit可以,但是(1)中说该Future的get方法在成功完成时将会返回null,那要是返回null,和用execute有什么区别?我直接使用execute就好
然后继续看源码, 点击进入了AbstractExecutorService抽象类源代码,发现源码如下:
public Future<?> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture<Void> ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
public <T> Future<T> submit(Runnable task, T result) {
if (task == null) throw new NullPointerException();
RunnableFuture<T> ftask = newTaskFor(task, result);
execute(ftask);
return ftask;
}
public <T> Future<T> submit(Callable<T> task) {
if (task == null) throw new NullPointerException();
RunnableFuture<T> ftask = newTaskFor(task);
execute(ftask);
return ftask;
}
这里显示把拿到的Runnable任务又抛给了execute()方法!
此时得出 结论: 如果提交的任务不需要一个结果的话直接用execute()会提高性能。
猜你喜欢
- 2025-09-01 Python定时任务,三步实现自动化_python定时任务,三步实现自动化
- 2025-09-01 (三)Java基础知识复习(异常处理)_java异常处理规则(新手必看)
- 2025-09-01 情人节脱单秘诀,程序员表白的情话大盘点!| CSDN 博文精选
- 2025-09-01 这几道面试题,可以考考自己_面试考什么题
- 2025-09-01 教程3 猜数字游戏_猜数字游戏玩法
- 2025-09-01 Go 学习:那些不一样的知识点(下)_不一样的知识的英文
- 2025-09-01 愤怒的TryCatch_愤怒的英文
- 2025-09-01 异常处理_异常处理培训心得怎么写
- 2025-09-01 catch at和catch up with的区别是什么
- 2025-09-01 优秀程序员需要掌握的代码整洁之道
- 最近发表
-
- C语言重要吗?_c语言重要吗计算机专业
- 2024 年顶级 C# 面试问题和答案_c#面试题及答案2020
- C#调用C++编写的DLL需要通过P/Invoke机制实现
- 掌握 C# 和 .NET:常用术语与概念_c#.net教程
- C++ .NET与C# .NET:谁才是.NET开发的“真香”选择?
- 是C++好,带GC的Java、C#好?还是Rust好?
- 为什么有人一直喜欢 C 而不喜欢 C++?
- Python定时任务,三步实现自动化_python定时任务,三步实现自动化
- (三)Java基础知识复习(异常处理)_java异常处理规则(新手必看)
- 情人节脱单秘诀,程序员表白的情话大盘点!| CSDN 博文精选
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)