Java GAE fetchAsync-什么';重点是什么?

Java GAE fetchAsync-什么';重点是什么?,java,multithreading,google-app-engine,Java,Multithreading,Google App Engine,Google鼓励我们使用fetchAsync而不是其他方式,说因为它是异步的,所以它将使用更少的实例小时。但是,该方法返回一个Future,您必须使用.get()方法来检索实际数据。.get()方法处于阻塞状态,即程序在返回(或引发异常)之前不会继续执行 问题是:这有什么区别?是否真的可以在不实际使用线程的情况下节省实例时间?区别在于,您可以在fetchAsync和get之间执行其他操作 您可以执行以下操作(伪代码): 现在,只需创建一个线程来调用fetch,就可以在线程化环境中实现同样的目的,

Google鼓励我们使用fetchAsync而不是其他方式,说因为它是异步的,所以它将使用更少的实例小时。但是,该方法返回一个
Future
,您必须使用
.get()
方法来检索实际数据。
.get()
方法处于阻塞状态,即程序在返回(或引发异常)之前不会继续执行


问题是:这有什么区别?是否真的可以在不实际使用
线程的情况下节省实例时间?

区别在于,您可以在
fetchAsync
get
之间执行其他操作

您可以执行以下操作(伪代码):


现在,只需创建一个线程来调用
fetch
,就可以在线程化环境中实现同样的目的,但这意味着要管理自己的线程以及它们之间的交互。无论如何,正如okrasz在评论中指出的那样,在GAE中创建新线程是不可能的(请参阅)


如果您只需要异步性(这是一个词吗?),而不必担心所有额外的东西,您可以使用如上所示的
fetchAsync/isDone/get
组合。

如果我在两者之间无事可做怎么办?@Ibolit:那么,无论如何,只要
fetch
。但请注意,在这种情况下,您的线程可能不会对外部影响做出响应。虽然未来尚未完成,但这是一个好的观点。不知怎么的,我从来没有想过。谢谢。“您可以通过简单地创建一个线程来达到同样的目的”-在GAE上不是这样,因为您无法在那里启动新线程…请注意,您假设的示例代码在dev_appserver上不起作用,因为在调用wait()之前,“异步”调用实际上不会执行,因此它只会进入无限循环。:)
future = fetcher.fetchAsync (url)
while not future.isDone():
    doSomethingElse()
current = future.get()