maxwellwenjie894
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
Honwhy
   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();
}
maxwellwenjie894
   2
maxwellwenjie894  
OP
   2021 年 7 月 30 日
谢谢回复,为什么不这样写呢?感觉范型在这里没啥用处啊
Future f1 = pool.submit(task);
Future f2 = pool.submit(task);
System.out.println(f1.get());
System.out.println(f2.get());
uinity
   3
uinity  
   2021 年 7 月 30 日
我个人觉得, 你得考虑到他是一个接口, 这个方法不一定只有这 AbstractExecutorService 这一种实现, 可能别的实现需要的返回结果不是 null 呢,你看下 ForkJoinTask 的实现.
Maxwellwenjie
   4
Maxwellwenjie  
   2021 年 8 月 2 日
非常感谢三楼的回复;那问题又来了,为什么 AbstractExecutorService 这种实现中 submit(Runnable task)方法要返回 Future<?>,返回 Future 不是更好吗?
uinity
   5
uinity  
   2021 年 8 月 4 日
@Maxwellwenjie 效果一样, 加上泛型更加规范一点吧
© 2026 V2EX · 28ms · 3.9.8.5