V2EX › 问与答
Java 求助:为什么线程池中 ExecutorService.submit(Runnable task) 返回 Future<?> 而不是 Future<Void>?
By maxwellwenjie894 at 2021 年 7 月 29 日 · 1972 次点击ExecutorService 有下面这个方法?
Future<?> submit(Runnable task)
但是 Future.get() 永远 return null,那下面这种方法声明是不是更好呢?
Future<Void> submit(Runnable task)
5 条回复 • 2021-08-04 12:07:36 +08:00
|
1
Honwhy 2021 年 7 月 29 日
我猜灵活可能是有好处的,
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(); } |
|
2
maxwellwenjie894 OP 谢谢回复,为什么不这样写呢?感觉范型在这里没啥用处啊
Future f1 = pool.submit(task); Future f2 = pool.submit(task); System.out.println(f1.get()); System.out.println(f2.get()); |
|
3
uinity 2021 年 7 月 30 日
我个人觉得, 你得考虑到他是一个接口, 这个方法不一定只有这 AbstractExecutorService 这一种实现, 可能别的实现需要的返回结果不是 null 呢,你看下 ForkJoinTask 的实现.
|
|
4
Maxwellwenjie 2021 年 8 月 2 日
非常感谢三楼的回复;那问题又来了,为什么 AbstractExecutorService 这种实现中 submit(Runnable task)方法要返回 Future<?>,返回 Future 不是更好吗?
|
|
5
uinity 2021 年 8 月 4 日
@Maxwellwenjie 效果一样, 加上泛型更加规范一点吧
|