3

我有一个自定义类,我在该类上对方法MyFutureTask extends FutureTask<Void>执行了一些代码。done()

我使用了一个调用submit(new MyFutureTask())它的 ExecutorService。

现在我可以保留对调用提交后返回的引用Future<?>,但是当我调用取消时,该isCancelled()方法永远不会返回 true。

我应该忽略Future<?>返回的对象,而是使用MyFutureTask并调用cancel(true)它吗?

那么Future<?>对象有什么用呢?

编辑:Java 中的 Future 和 FutureTask 有什么区别?从这个线程我明白了区别。

除了默认的取消行为,我还想尝试停止正在进行的网络调用,所以我想我将使用 FutureTask 的路由是正确的。有人可以确认吗?

4

2 回答 2

0

不要使用Executor.submit,而是使用,Executor.execute因为你已经一个 Future。当您调用提交时,您只是将您的 FutureTask 包装在另一个FutureTask 中。

于 2012-02-13T19:36:04.533 回答
0

你也不能“停止”一次网络旅行。您必须等到它返回或超时。您所做的是调用 Future.cancel(true),然后当您的网络旅行返回时,查看未来是否已被取消 Future.isCancelled()。那么你可以停止做你在未来所做的事情。出于所有意图和目的,它与取消网络旅行的效果相同。对于最终用户(即客户端代码或调用者),它将以相同的方式出现。您可能会注意到的唯一副作用是,如果您只有一个线程执行任务,在这种情况下,等待网络行程的线程必须返回,然后才能执行下一个任务。如果这是使用线程池的问题。

顺便说一句,如果您使用 NIO 或其某个库,您可以立即停止等待结果,但编写代码需要做更多的工作。

于 2012-02-13T19:42:42.770 回答