点个关注,必回关
文章目录
一. execute和submit的区别与联系
- execute和submit都属于线程池的方法,execute只能提交Runnable类型的任务,而submit既能提交Runnable类型任务也能提交哦啊Callable类型任务
- execute会直接抛出任务执行时的异常,submit会吃掉异常,可以通过Future的get方法将任务执行时的异常重新抛出
- execute所属顶层接口是Executor,submit所属顶层接口是ExecutorService,实现类ThreadPoolExecutor重写了execute方法,抽象类AbstractExecutorService重写了submit方法。
submit和execute由于参数不同有四种实现形式,
如下所示,本文主要研究这四种形式在各自使用场景下的区别和联系
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
void execute(Runnable command);
关于Runnable和Callable任务如果你还存在疑惑,建议你先看看我的另一篇文章Runnable和Callable的区别和联系。
1、测试代码的整体框架如下:
import java.util.concurrent.*;
public class TestSubmitAndExecute {
static ExecutorService executor = Executors.newCachedThreadPool();
public static void main(String[] args) {
initExecutors();
/**put test codes here*/
/***/
waitToTerminated();
}
private static void initExecutors() {
if (executor.isTerminated()) {
executor = Executors.newCachedThreadPool();
}
}
private static void waitToTerminated() {
executor.shutdown();
while (!executor.isTerminated()) {
}
}
/**
* 测试 submit(Callable<T> task)
*
* @param callable
* @param <T>
* @return
*/
public static <T> T testSubmitCallable(Callable callable) {
Future<T> future = executor.submit(callable);
T result = null;
try {
result = future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return result;
}
/**
* 测试submit(Runnable task, T result)
*
* @param runnable
* @param t
* @param <T>
* @return
*/
public static <T> T testSubmitRunnable(Runnable runnable, T t)