在Java中实现ListeningExecutorService 5(Implementing Li

2019-09-16 15:38发布

在Java 5中, ExecutorService接口声明的方法:

<T> List<Future<T>> invokeAll(Collection<Callable<T>> tasks)
    throws InterruptedException;

而番石榴11.0.2,用Java编写的6,但与Java 5按说兼容,覆盖它ListeningExecutorService为:

 <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
     throws InterruptedException;

如果我想实现我自己的ListeningExecutorService ,我需要实现这两种方法,但我也不能有两个方法:同一消失,所以这是一个有点左右为难的。

有没有解决这个问题的任何方式? 更具体地讲,有没有什么办法来实现ListeningExecutorService在Java 5中?

作为一个侧面说明任何番石榴乡亲-它实际上是必要的,因为它已经从继承番石榴重新声明此方法ExecutorService

Answer 1:

我们做这项工作的方式是覆盖JDK的ExecutorService的接口在我们的引导类路径。 你可以做你的项目的编译过程中类似的东西。 看看我们的设置最简单的方法可能是删除它释放12的变化 (因为该版本需要JDK6)。



Answer 2:

原始方法的签名已被报告为一个错误并固定为JDK 6: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6267833

引述分辨率消息:

  • 是二进制兼容的。
  • 是源用于ExecutorService的用户兼容
  • 要求对小的一组谁已经实施的ExecutorService没有AbstractExecutorService的继承默认的实现开发商轻微修改源代码。 这组受影响的开发商都是开发者创建复杂的线程池的应用程序,将它们放入了“并发火箭科学家”的范畴。 他们一般会理解这种变化。 可能的编译器错误是微不足道的源代码来解决。


Answer 3:

我能想到的实现这两个接口的唯一途径,可怕的,因为它是,是

List invokeAll(Collection tasks)

降泛型类型,说明为什么你在做它,并且要非常小心。



文章来源: Implementing ListeningExecutorService in Java 5