我应该在Future <! - ? - >或我自己的FutureTask上调用cancel(true)

时间:2012-02-13 19:32:12

标签: java multithreading executorservice executor executors

我有一个自定义类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的路线是正确的。有人可以确认吗?

2 个答案:

答案 0 :(得分:0)

请勿使用Executor.submit,而是使用Executor.execute,因为您已经拥有未来。当你调用submit时,你只是不必要地将你的FutureTask包装在另一个 FutureTask中。

答案 1 :(得分:0)

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

另外,如果您使用NIO或其中某些库,您可能会立即停止等待结果,但这需要更多的代码编写工作。