V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
maxwellwenjie894
V2EX  ›  问与答

Java 求助:为什么线程池中 ExecutorService.submit(Runnable task) 返回 Future<?> 而不是 Future<Void>?

  •  
  •   maxwellwenjie894 · 180 天前 · 528 次点击
    这是一个创建于 180 天前的主题,其中的信息可能已经有所发展或是发生改变。

    ExecutorService 有下面这个方法?

    Future<?> submit(Runnable task)

    但是 Future.get() 永远 return null,那下面这种方法声明是不是更好呢?

    Future<Void> submit(Runnable task)

    5 条回复    2021-08-04 12:07:36 +08:00
    Honwhy
        1
    Honwhy  
       180 天前
    我猜灵活可能是有好处的,
    public static void main(String[] args) throws ExecutionException, InterruptedException {
    ExecutorService pool = Executors.newFixedThreadPool(1);
    String ret = "";
    FutureTask<String> task = new FutureTask<>(() -> {
    }, ret);
    Future<String> f1 = (Future<String>) pool.submit(task);
    Future<Void> f2 = (Future<Void>) pool.submit(task);
    System.out.println(f1.get());
    System.out.println(f2.get());
    pool.shutdown();
    }
    maxwellwenjie894
        2
    maxwellwenjie894  
    OP
       180 天前
    谢谢回复,为什么不这样写呢?感觉范型在这里没啥用处啊
    Future f1 = pool.submit(task);
    Future f2 = pool.submit(task);
    System.out.println(f1.get());
    System.out.println(f2.get());
    uinity
        3
    uinity  
       179 天前
    我个人觉得, 你得考虑到他是一个接口, 这个方法不一定只有这 AbstractExecutorService 这一种实现, 可能别的实现需要的返回结果不是 null 呢,你看下 ForkJoinTask 的实现.
    Maxwellwenjie
        4
    Maxwellwenjie  
       177 天前
    非常感谢三楼的回复;那问题又来了,为什么 AbstractExecutorService 这种实现中 submit(Runnable task)方法要返回 Future<?>,返回 Future 不是更好吗?
    uinity
        5
    uinity  
       175 天前
    @Maxwellwenjie 效果一样, 加上泛型更加规范一点吧
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4248 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:19 · PVG 16:19 · LAX 00:19 · JFK 03:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.