GWT中的线程(客户端)

50

据我所知,当您构建GWT应用程序时,整个客户端都会转换为Javascript,因此我认为这个问题涉及到Javascript以及GWT提供的可能性。

我有几十个进程需要在我的GWT应用程序中启动,每个进程都将持续调用服务器。GWT支持线程吗? GWT客户端支持线程吗?

编辑:

link指出:

No JavaScript knowledge required If you’re just a user of the framework, 
which I am for the matter of discussion, you do not need to know JavaScript 
in order to write dynamic content, be it client-side such as rolling frames, 
docking panels or scheduled “multi-threading” tasks, or server-side calls 
using XMLHttpRequests (aka AJAX). 

“多线程”任务是指按照预定时间执行的任务。
4个回答

37

JavaScript 不支持多线程。不过,GWT 提供了一个类来“模拟”线程,虽然不是真正的多线程,但在大多数情况下可以满足你的需求:com.google.gwt.core.client.Scheduler.ScheduledCommand。这种技术基于定时器类,它会在给定时间后执行方法。

例如,当将以下代码放入你自己的代码中时,scheduleDeferred 方法将直接返回,并且你的代码会在命令后继续运行,而 execute() 方法会使用定时器执行:

Scheduler.get().scheduleDeferred(new ScheduledCommand() {
   public void execute() {
      .. code here is executed using the timer technique.
   }
});
您可以创建一个重复命令RepeatingCommand,用于多次运行命令。使用Scheduler.get().scheduleIncremental()开始执行该命令,直到执行方法返回false。您可以将任务分成子任务,以获得更好的“线程”行为。 Scheduler支持一些其他启动定时命令的方法。有关详细信息,请参见JavaDoc

通过新的GWT类进行编辑和更新,而不是使用已弃用的DeferredCommand


1
请纠正我如果我错了,但是 - 我可以在服务器端使用Java线程,对吗?如果是这样的话,那么我认为你的答案帮了我很大的忙,因为我觉得我可以重新设计我的系统,围绕着客户端的DeferredCommand和服务器端的Java线程。 - Federer
很可能你不能在服务器本身使用线程,因为服务器不允许创建线程。但是每个来自浏览器对服务器的调用都会启动一个“线程”,如果你想要启动一个与浏览器调用无关的进程或者不想让浏览器调用等待服务器的答复,那么很可能只需要一个线程。但总的来说,这取决于你想要用你的应用程序做什么。 - Hilbrand Bouwkamp
2
“服务器不允许创建线程”是什么意思?指的是哪个服务器?虽然这不是一个好的做法,但如果Tomcat没有明确禁止线程创建的安全策略,你可以像在任何Java程序中一样在服务器端创建线程,对吧! - SyntaxT3rr0r
@WizardOfOdds:我应该更加具体。正如你所提到的,当安全策略不允许时,它是不被允许的,而在EJB中也是如此,但后者不适用于Tomcat。无论如何,我不建议在服务器中使用线程。 - Hilbrand Bouwkamp
您可以通过超级源化自己的Thread.java实现来使GWT支持java.lang.Thread,从而在GWT中模拟所需的任何行为。当您调用Thread.start()时,服务器将并发运行,客户端可以使用Scheduler.get().scheduleRepeatingCommand或其他您喜欢的方法。要编写可与gwt共享的线程安全代码,您需要至少超级源化一些类,如ThreadLocal和ConcurrentHashMap。 - Ajax

4

作为HTML5的一部分,Web Workers的工作在许多浏览器中得到了实现,但并非所有浏览器都支持(尤其是Internet Explorer)。您可以在支持的浏览器中使用这些功能,但您应该查看JavaScript编程模型。

JavaScript通常是异步工作的。请求被发送,并在某个时刻作为事件接收其答案。您可以同时有大量挂起的请求。不过,这将需要对系统进行重新设计。


1

0
JavaScript不支持多线程,所以无论GWT做什么,多线程都必须完全在服务器端完成,因为GWT只能使用已经在客户端可用的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接