Java 为什么ExecutorService.submit(可运行任务)返回Future<&燃气轮机;而不是未来<;无效>;?
具有以下方法: 但是由于这个Java 为什么ExecutorService.submit(可运行任务)返回Future<&燃气轮机;而不是未来<;无效>;?,java,multithreading,asynchronous,future,executorservice,Java,Multithreading,Asynchronous,Future,Executorservice,具有以下方法: 但是由于这个Future的get方法总是返回null,下面的签名不是更合适吗 Future submit(Runnable task)因为ExecutorService的Future接口是为从另一个线程获取返回数据而创建的,而不仅仅是为了运行它。 Future submit(Runnable task)的工作原理与new Thread(Runnable.start()相同,在某些情况下返回null是有意义的 编辑: 我想你需要在20分钟后关闭一个线程。当您有一个返回值void时
Future
的get
方法总是返回null
,下面的签名不是更合适吗
Future submit(Runnable task)
因为ExecutorService
的Future
接口是为从另一个线程获取返回数据而创建的,而不仅仅是为了运行它。
Future submit(Runnable task)
的工作原理与new Thread(Runnable.start()
相同,在某些情况下返回null
是有意义的
编辑:
我想你需要在20分钟后关闭一个线程。当您有一个返回值void
时,您将如何执行该操作
Future<Void> future = execService.submit(operation);
execService.shutdown();
opResult = future.get(20, TimeUnit.MINUTES);
Future=execService.submit(操作);
execService.shutdown();
opResult=future.get(20,时间单位:分钟);
此代码必须给出错误,因为在
future
上没有返回。但是如果它返回空值,execService
控制器对象将知道发生了关闭。或者如果它在20分钟内没有返回任何内容,则可以使用execService.shutdownNow()
。注意Runnable
的run
方法返回void
原语,而不是void
类型。因此,Future
不能有Void
类型,解决方案是将其设为通配符。请注意,Future
来自Java1.5,而Runnable
来自1.0。由于遗留代码的原因,他们不会更改run
的返回类型以符合未来的。jdk1.6中使用Jdk 1.8 inside submit方法实现void,而jdk1.6中它是Object。我的理解是使用void更合适,这就是为什么jdk1.7/1.8中会更改它。只是为了支持不更改的接口它
public Future<?> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture<Void> ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
公共未来提交(可运行任务){
如果(task==null)抛出新的NullPointerException();
RunnableFuture ftask=newTaskFor(任务,空);
执行(ftask);
返回ftask;
}
在JDK1.6中
public Future<?> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture<Object> ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
公共未来提交(可运行任务){
如果(task==null)抛出新的NullPointerException();
RunnableFuture ftask=newTaskFor(任务,空);
执行(ftask);
返回ftask;
}
如果它是Future
,它的工作方式将与现在完全相同。如何从调用方法返回Void?Void方法(){return null;}
return null与Void signed方法不同。Op首先要求不返回值,我的意思是java.lang.Void
(导入后缩写为Void
),而不是Void
,与Op的做法相同。其次,OP并不是要求无返回值。是的,我知道他们不想在之后更改接口。但为什么一开始就以这种方式定义它呢<代码>无效
类型自开始可用。所以我猜这只是一个错误。Future
的get方法将始终返回null
,这正是这种情况下所要求的Future
可以返回任何对象,而在这种特殊情况下,实际上它总是返回null
,如submit
方法的javadoc中所述。因此Future
在这里是正确的选择。类似地,如果run
将返回double
aFuture
将是合适的,而不是Future
。