GWT中的线程(客户端)

GWT中的线程(客户端),gwt,multithreading,Gwt,Multithreading,据我所知,GWT应用程序的整个客户端在构建时都会转换为Javascript,因此我认为这个问题与Javascript和GWT提供的可能性有关 我有几十个进程需要在我的GWT应用程序中启动,每个进程都会不断地调用服务器。GWT支持线程吗?GWT客户端是否支持线程 编辑: 该条规定: 或计划的“多线程”任务,这意味着什么?JavaScript不支持多线程,因此无论GWT做什么,多线程都必须仅在服务器端完成,因为GWT只能使用客户端已经提供的功能。作为HTML5的一部分,Web Workers已经在许

据我所知,GWT应用程序的整个客户端在构建时都会转换为Javascript,因此我认为这个问题与Javascript和GWT提供的可能性有关

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

编辑:

该条规定:


或计划的“多线程”任务,这意味着什么?

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

作为HTML5的一部分,Web Workers已经在许多浏览器中实现,但不是在所有浏览器(最明显的是internet explorer)上实现。您可以在可用的地方使用这些特性,但您应该做的是查看javascript编程模型


Javascript通常是异步工作的。请求被触发,在某个时刻,它们的答案作为一个事件被接收。您可以同时有大量挂起的请求。不过,这需要重新设计系统。

JavaScript不支持多线程。但是,GWT有一个类来“模拟”线程,这不是真正的多线程,但在大多数情况下,它会满足您的需要:
com.google.GWT.core.client.ScheduledCommand
。该技术基于timer类,该类在给定时间过后执行方法

例如,在您自己的代码中放置以下代码时,
schedulederferred
方法将直接返回,并且您的代码将在命令后继续,而
execute()
方法将使用计时器执行:

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


用新的GWT类编辑和更新,而不是不推荐的
DeferredCommand

新方法是使用纠正我的错误,但是-我可以在服务器端使用Java线程,对吗?如果这是正确的,那么我认为您的回答对我帮助很大,因为我认为我可以围绕客户端的DeferredCommand和服务器端的Java线程重新设计我的系统。很可能您不能在服务器本身中使用线程,因为服务器不允许创建线程。但是从浏览器对服务器的每次调用都会启动一个
线程
,只有当您想启动一个与来自浏览器的调用无关的进程,或者您不想让来自浏览器的调用等待服务器的应答时,才最有可能需要一个线程。但一般来说,这完全取决于您试图对应用程序执行的操作。您所说的“服务器不允许创建线程”是什么意思?哪个服务器?我并不是说这是一个好的实践,但是如果Tomcat没有明确的安全策略来阻止线程的创建,那么您可以像在任何Java程序中一样在服务器端创建线程不@奇才:我应该说得更具体些。当安全策略不允许它时,这是不允许的,正如您提到的,EJB中不允许,但后者不适用于Tomcat。无论如何,我不建议在服务器中使用线程。您可以通过超级外包您自己的Thread.java自定义实现,使GWT支持java.lang.Thread,该实现可以只模拟GWT中您想要的任何行为。调用Thread.start()时,服务器将并发运行,客户端可以使用Scheduler.get().scheduleRepeatingCommand/任何您喜欢的命令。要编写可与gwt共享的线程安全代码,您至少需要超级源代码大量的类,比如ThreadLocal和ConcurrentHashMap。
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
   public void execute() {
      .. code here is executed using the timer technique.
   }
});