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()会提高性能。