Java 未来的可运行实例<>;?
我在读一些javadoc,突然发现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
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);
}
}