您说对了,那是对的。
FutureTask#done()系统 最多 会调用 一次
,因此如果任务在通过运行之前已被取消
RunnableFuture#run(),您将错过对的呼叫
FutureTask#done()。
您是否考虑过一种更简单的方法,该方法总是向
ITaskStatusHandler#taskRunning()和发出对称的成对调用集
ITaskStatusHandler#taskCompleted(),像这样?
@Overridepublic void run() { statusHandler.TaskRunning(this); try { super.run(); finally { statusHandler.TaskCompleted(this); }}一旦
RunnableFuture#run()被调用,您的任务确实正在运行,或者至少正在尝试运行。一旦
FutureTask#run()完成,你的任务不再运行。碰巧在取消的情况下,过渡是(几乎)立即进行的。
试图避免
ITaskStatusHandler#taskRunning()如果内部
Callable或
Runnable从未被调用,
FutureTask#run()则需要您在
Callableor
Runnable和-
FutureTask派生类型本身之间建立一些共享结构,以便在首次调用内部函数时,设置一些标志,使外部
FutureTask派生类型可以观察为锁存器,表明是的,该函数在取消
之前 确实开始运行。但是,到那时,您必须承诺要调用
ITaskStatusHandler#taskRunning(),因此区别并不是那么有用。
我一直在挣扎了类似的设计问题最近,彼时安定在对称的 前 和 手术后 我重写
FutureTask#run()方法。



