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

2021-07-29 22:30:53 +08:00
 maxwellwenjie894

ExecutorService 有下面这个方法?

Future<?> submit(Runnable task)

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

Future<Void> submit(Runnable task)

1018 次点击
所在节点    问与答
5 条回复
Honwhy
2021-07-29 22:53:54 +08:00
我猜灵活可能是有好处的,
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
2021-07-30 00:07:20 +08:00
谢谢回复,为什么不这样写呢?感觉范型在这里没啥用处啊
Future f1 = pool.submit(task);
Future f2 = pool.submit(task);
System.out.println(f1.get());
System.out.println(f2.get());
uinity
2021-07-30 18:02:02 +08:00
我个人觉得, 你得考虑到他是一个接口, 这个方法不一定只有这 AbstractExecutorService 这一种实现, 可能别的实现需要的返回结果不是 null 呢,你看下 ForkJoinTask 的实现.
Maxwellwenjie
2021-08-02 15:51:00 +08:00
非常感谢三楼的回复;那问题又来了,为什么 AbstractExecutorService 这种实现中 submit(Runnable task)方法要返回 Future<?>,返回 Future 不是更好吗?
uinity
2021-08-04 12:07:36 +08:00
@Maxwellwenjie 效果一样, 加上泛型更加规范一点吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/792575

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX