我有一个自定义类MyFutureTask extends FutureTask<Void>
,我在done()
方法上执行了一些代码。
我使用ExecutorService,我将其称为submit(new MyFutureTask())
。
现在我可以保持对调用submit后返回的Future<?>
的引用,但是当我调用cancel时,isCancelled()
方法永远不会返回true。
我是否应该忽略返回的Future<?>
对象,而是使用MyFutureTask
并在其上调用cancel(true)
?
那么Future<?>
对象的用途是什么?
编辑:What's the difference between Future and FutureTask in Java?来自这个帖子,我理解其中的区别。
除了默认的取消行为,我还想尝试停止正在进行的网络通话,所以我想我将使用FutureTask的路线是正确的。有人可以确认吗?
答案 0 :(得分:0)
请勿使用Executor.submit
,而是使用Executor.execute
,因为您已经拥有未来。当你调用submit时,你只是不必要地将你的FutureTask包装在另一个 FutureTask中。
答案 1 :(得分:0)
此外,您无法“停止”网络旅行。你必须等到它返回或超时。你所做的是调用Future.cancel(true),然后当你的网络旅行返回时查看未来是否已取消Future.isCancelled()。你可以停止做你在未来做的事情。对于所有意图和目的,它与您取消网络旅行的效果相同。对于最终用户(即客户端代码或呼叫者),它将以相同的方式出现。您可能注意到的唯一副作用是,如果您只有一个线程执行任务,在这种情况下,等待网络旅行的线程必须返回才能获取下一个任务。如果这是使用线程池的问题。
另外,如果您使用NIO或其中某些库,您可能会立即停止等待结果,但这需要更多的代码编写工作。