我目前正在使用FutureTasks和Executors在多线程环境中寻找一个令人讨厌的错误。基本思想是让固定数量的线程执行单独的FutureTasks,这些FutureTasks计算要在表中显示的结果(请不要在此注意GUI方面)。
我已经看了很久了,我开始怀疑我的理智。
考虑这段代码:
public class MyTask extends FutureTask<Result> {
private String cellId;
...
protected void done() {
if (isCancelled()) return;
try {
Result r = get(); // should not wait, because we are done
... // some processing with r
sendMessage(cellId, r);
} catch (ExecutionException e) { // thrown from get
...
} catch (InterruptedException e) { // thrown from get
...
}
}
...
}
当执行MyTask实例的执行程序调用
done()
时,我检查是否到达那里,因为任务已取消。如果是这样,我将跳过所有剩余的 Activity ,尤其是不调用sendMessage()
。FutureTask.done()的文档说:
但是我从
FutureTask
的文档中没有得到的是执行done()
时的语义。如果我在开始时通过了isCancelled()
检查,但是紧接着又有其他线程调用我的cancel()
方法,该怎么办?从那以后,这会导致我的任务改变主意并回复isCancelled() == true
吗?如果是这样,我以后如何知道消息是否已发送?查看
isDone()
只会告诉我该任务的执行已完成,但是由于isCancelled()
也是正确的,所以我不知道它是否能够及时发送消息。也许这很明显,但是我现在还没有真正看到它。
最佳答案
从API(重点是我的):
因此,FutureTask正在解决这样一个假设:当任务已转换到isDone阶段时,您无法取消它。