ExecutorService的submit方法的坑
Posted dragonfei.org
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ExecutorService的submit方法的坑相关的知识,希望对你有一定的参考价值。
先看一段代码:
public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerException(); RunnableFuture<Void> ftask = newTaskFor(task, null); execute(ftask); return ftask; }
protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) { return new FutureTask<T>(runnable, value); }
注意,如果submit提交的参数传递的Runnable类型会将Runnable适配为一个FutureTask对象,但结果为null,及Future.get()的结果为null。
这会有一个问题:如果submit提交的参数本身就是一个FutureTask,那么他的结果也会被适配为null,导致与预期结果不符。解决办法,如果本省就是FutureTask,则使用execute方法提交。
ListenableFutureTask<RecordSet> f = new SecondTaskFutureTask(new Callable<RecordSet>() { @Override public RecordSet call() throws Exception { RecordSet rs = process.process(pw); return rs; } }); ex.execute(f); RecordSet rs = f.get();
以上是关于ExecutorService的submit方法的坑的主要内容,如果未能解决你的问题,请参考以下文章
ExecutorService中submit和execute区别
AbstractExecutorService的submit方法概要介绍
多线程ExecutorService中submit和execute区别