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
a
Future
将是合适的,而不是
Future