当前位置: 首页 > 知识库问答 >
问题:

为什么executorservice . submit(Runnable task)返回Future 而不是未来的< Void >?

闻人举
2023-03-14

执行器服务具有以下方法

将来的

但是,由于这个<code>未来</code>的<code>get</code>方法将始终返回<code>null</code>以下签名是否更合适?

<代码>未来

共有3个答案

危璞
2023-03-14

因为 ExecutorService 的未来接口是为从另一个线程获取返回数据而创建的,而不仅仅是为了运行它。前途

编辑:认为您需要在20分钟后关闭一个线程。当您有一个返回值<code>void</code>时,您会怎么做?

Future<Void> future = execService.submit(operation);
execService.shutdown();
opResult = future.get(20, TimeUnit.MINUTES);

此代码必须给出错误,因为将来没有回报。但是,如果它返回 null,execService 控制器对象将知道关闭已发生。或者,如果它在20分钟内没有返回任何内容,则可以使用execService.shutdownNow()。

鄢雅畅
2023-03-14

请注意,Runnablerun 方法返回 void 基元,而不是 Void 类型。因此,Future不能有Void类型,解决方案是使其成为通配符。请注意,Future 来自 java 1.5,而 Runnable 来自 1.0。由于遗留代码的原因,他们不会更改run的返回类型以符合未来

公冶高义
2023-03-14

Jdk 1.8在提交方法实现中使用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;
    }

在JDK是1.6

 public Future<?> submit(Runnable task) {
       if (task == null) throw new NullPointerException();
       RunnableFuture<Object> ftask = newTaskFor(task, null);
       execute(ftask);
        return ftask;
   }
 类似资料:
  • 我正在尝试以下方法,并认为我会失败 但是我却得到了 有人能回答为什么吗?

  • 此答案指示如何将转换为,同时管理将发生阻塞的位置: 我的问题和评论中的问题一样: 怎么了?为什么你使用一个额外的线程与Promise结合? 答复如下: 它会在你拉线的时候卡住线。如果您已经为这样的未来配置了ExecutionContext,这很好,但是默认的ExecutionContext包含的线程与您拥有的处理器一样多。 我不确定我是否理解这个解释。重申: 有什么问题?在未来内部阻塞不是和手动创

  • 问题内容: 据我所知,使用或实例化对象分别返回或的新实例。具有 新标识 的新实例对象。 在我实际测试它之前,这对我来说是很清楚的,我注意到它实际上返回了而不是预期的: 如预期的那样,分别使用和创建对象时,也会表现出这种行为: 我可以在状态文档中找到唯一相关的信息: […]例如,return和return 。 如果未提供任何参数,则构造函数将创建一个新的空元组。 可以说,这不足以回答我的问题。 那么

  • 问题内容: 为什么不: 代替: 获得唯一哈希码的更高机会? 问题答案: 因为数组的最大长度为。 由于的主要用途是确定将对象插入/ 的后备数组中的哪个插槽,因此hashcode> 将无法存储在该数组中。

  • 问题内容: 有人可以解释为什么我想要的结果“ hi”以字母“ b”开头并以换行符开头吗? 我正在使用 Python 3.3 如果我使用python 2.7运行此额外的“ b”,则不会出现 问题答案: 默认情况下,echo命令返回换行符 与此比较: 至于字符串前面的 b ,则表明它是一个字节序列,等效于Python 2.6+中的常规字符串 http://docs.python.org/3/refer

  • 我已经能够验证是否会产生排序的。但是,它不会返回列表。为什么?