Java 未来的可运行实例<>;?

Java 未来的可运行实例<>;?,java,multithreading,threadpool,future,runnable,Java,Multithreading,Threadpool,Future,Runnable,我在读一些javadoc,突然发现 class ExtendedExecutor扩展ThreadPoolExecutor{ // ... 执行后受保护的无效(可运行的r、可丢弃的t){ super.afterExecute(r,t); if(t==null&&r未来实例){ 试一试{ 对象结果=((未来)r.get(); }捕获(取消异常){ t=ce; }捕获(被执行者){ t=ee.getCause(); }捕获(中断异常ie){ Thread.currentThread().interru

我在读一些javadoc,突然发现

class ExtendedExecutor扩展ThreadPoolExecutor{
// ...
执行后受保护的无效(可运行的r、可丢弃的t){
super.afterExecute(r,t);
if(t==null&&r未来实例){
试一试{
对象结果=((未来)r.get();
}捕获(取消异常){
t=ce;
}捕获(被执行者){
t=ee.getCause();
}捕获(中断异常ie){
Thread.currentThread().interrupt();//忽略/重置
}
}
如果(t!=null)
系统输出打印ln(t);
}
}
有人能解释一下代码是如何通过第一个if的吗。我是说
r
如何成为
Future
的实例

有人能解释一下代码是如何通过第一个if的吗。我是说r怎么可能是未来的实例

你感到困惑是对的。这是一个有点奇怪的代码,它传入一个
Runnable
,然后试图将它转换为一个
未来的
,而这个
未来的
不会扩展
Runnable
。这不是你经常看到的模式。这在javadocs中,在查看代码之后,方法的
r
参数就是已经完成的任务

我认为如果代码是
FutureTask
而不是
Future
,那么代码会干净得多<代码>未来任务
甚至在javadocs中的示例代码上方提到:

当操作包含在任务中时(例如{@link FutureTask})

FutureTask
实现了
RunnableFuture
,它既是
RunnableFuture
又是
Future
,因此代码可以工作,但使用
FutureTask
会比较容易混淆

有人能解释一下代码是如何通过第一个if的吗。我是说r怎么可能是未来的实例

你感到困惑是对的。这是一个有点奇怪的代码,它传入一个
Runnable
,然后试图将它转换为一个
未来的
,而这个
未来的
不会扩展
Runnable
。这不是你经常看到的模式。这在javadocs中,在查看代码之后,方法的
r
参数就是已经完成的任务

我认为如果代码是
FutureTask
而不是
Future
,那么代码会干净得多<代码>未来任务
甚至在javadocs中的示例代码上方提到:

当操作包含在任务中时(例如{@link FutureTask})


FutureTask
实现了
RunnableFuture
,它既是
RunnableFuture
又是
Future
,因此代码可以工作,但是使用
FutureTask
会比较容易混淆。

是一个类型参数,而不是一个类型参数

“?”是类型参数,而不是类型参数

你能解释一下为什么你认为这是不可能的吗?嗯,也许
r
是一个。
公共类Foo实现了可运行的未来{…}
非常感谢大家!你能解释一下为什么你认为这是不可能的吗?嗯,也许
r
是一个。
公共类Foo实现了可运行的未来{…}
非常感谢大家
FutureTask
是属于
Runnable
Future
的实现之一。可能存在另一组对象,它们既是
Runnable
对象的一部分,也是
Future
对象的一部分,但仍然是
FutureTask
对象的一部分。我认为javadoc更精确。如果使用
FutureTask
,您可能会错过第三方框架甚至您可能引入的一些实现。
FutureTask
是属于
Runnable
Future
的实现之一。可能存在另一组对象,它们既是
Runnable
对象的一部分,也是
Future
对象的一部分,但仍然是
FutureTask
对象的一部分。我认为javadoc更精确。如果您使用
FutureTask
,您可能会错过一些第三方框架甚至您可能引入的实现。
class ExtendedExecutor extends ThreadPoolExecutor {
   // ...
   protected void afterExecute(Runnable r, Throwable t) {
     super.afterExecute(r, t);
     if (t == null && r instanceof Future<?>) {
       try {
         Object result = ((Future<?>) r).get();
       } catch (CancellationException ce) {
           t = ce;
       } catch (ExecutionException ee) {
           t = ee.getCause();
       } catch (InterruptedException ie) {
           Thread.currentThread().interrupt(); // ignore/reset
       }
     }
     if (t != null)
       System.out.println(t);
   }
 }