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 效果一样, 加上泛型更加规范一点吧 |