ExecutorService 有下面这个方法?
Future<?> submit(Runnable task)
但是 Future.get() 永远 return null,那下面这种方法声明是不是更好呢?
Future<Void> submit(Runnable task)
1
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(); } |
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-07-30 18:02:02 +08:00
我个人觉得, 你得考虑到他是一个接口, 这个方法不一定只有这 AbstractExecutorService 这一种实现, 可能别的实现需要的返回结果不是 null 呢,你看下 ForkJoinTask 的实现.
|
4
Maxwellwenjie 2021-08-02 15:51:00 +08:00
非常感谢三楼的回复;那问题又来了,为什么 AbstractExecutorService 这种实现中 submit(Runnable task)方法要返回 Future<?>,返回 Future 不是更好吗?
|
5
uinity 2021-08-04 12:07:36 +08:00
@Maxwellwenjie 效果一样, 加上泛型更加规范一点吧
|