为什么ExecutorService.submit(Runnable task)返回Future <! - ? - >而不是Future <void>?

时间:2017-05-15 08:07:08

标签: java multithreading asynchronous future executorservice

ExecutorService有以下方法:

Future<?> submit(Runnable task)

但是,由于此Future get方法始终会返回null,因此以下签名更合适吗?

Future<Void> submit(Runnable task)

3 个答案:

答案 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}}接口是为了从另一个线程获取返回数据而不仅仅是为了运行它。 FutureFuture<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