我有一个自定义类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或其某个库,您可以立即停止等待结果,但这需要做更多的代码工作。