我应该在 Future<?> 上调用 cancel(true) 还是在我自己的 FutureTask 上调用 cancel(true)



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

我使用了一个ExecutorService,我将其调用为submit(new MyFutureTask())

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

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

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

edit:What';Java中的Future和FutureTask有什么区别?从这条线索中,我明白了其中的区别。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新