我目前正在使用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阶段时,您无法取消它。

09-26 14:59