ExecutorService有以下方法:
Future<?> submit(Runnable task)
但是,由于此Future
get
方法始终会返回null
,因此以下签名更合适吗?
Future<Void> submit(Runnable task)
答案 0 :(得分:1)
请注意,Runnable
的{{1}}方法返回run
原语,而不是void
类型。出于这个原因,Void
不能有Future
类型,解决方案是使其成为通配符。请注意,Void
来自java 1.5,而Future
来自1.0。由于遗留代码原因,他们不会将Runnable
的返回类型更改为符合run
。
答案 1 :(得分:1)
Jdk 1.8内部提交方法实现void在jdk1.6中使用它是Object。我的理解是使用void更为合适的原因是它在jdk1.7 / 1.8中被更改的原因。仅支持接口不改变它
WHERE orders.zip_code >= provinces.starting_zip
AND orders.zip_code <= provinces.ending_zip
和JDK 1.6
public Future<?> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture<Void> ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
答案 2 :(得分:0)
因为创建ExecutorService
的{{1}}接口是为了从另一个线程获取返回数据而不仅仅是为了运行它。
Future
与Future<Void> submit(Runnable task)
的工作方式相同,new Thread(runnable).start()
的返回对某些情况有意义。
修改:
认为你需要在20分钟后关闭一个线程。当你有一个返回值null
时,你会怎么做?
void
此代码必须提供错误,因为Future<Void> future = execService.submit(operation);
execService.shutdown();
opResult = future.get(20, TimeUnit.MINUTES);
上没有返回。但是如果它返回null,则future
控制器对象将知道发生了execService
。或者,如果它在20分钟内没有返回任何内容,则可以使用shutdown
。