【问题标题】:Threading in GWT (Client)GWT 中的线程(客户端)
【发布时间】:2011-02-05 03:49:03
【问题描述】:

据我了解,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). 

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

【问题讨论】:

    标签: gwt multithreading


    【解决方案1】:

    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() 启动它,它将执行命令,直到execute 方法返回false。您可以使用它将任务拆分为子任务以获得更好的“线程”行为。 Scheduler 支持一些额外的方法来以不同的方式启动预定的命令。有关详细信息,请参阅JavaDoc

    已编辑并更新为新的 GWT 类,而不是已弃用的 DeferredCommand

    【讨论】:

    • 如果我错了,请纠正我 - 我可以在服务器端使用 Java 线程,对吗?如果这是正确的,那么我认为您的回答对我有很大帮助,因为我认为我可以围绕客户端的 DeferredCommand 和服务器端的 Java 线程重新设计我的系统。
    • 很可能您不能在服务器本身中使用线程,因为服务器不允许创建线程。但是从浏览器对服务器的每次调用都会启动一个thread,并且很可能只有当您想要启动一个与来自浏览器的调用无关的进程或者您不希望调用来自浏览器时才需要一个线程浏览器等待服务器的回答。但总的来说,这一切都取决于您要对您的应用程序做什么。
    • “服务器不允许创建线程”是什么意思?哪个服务器?我并不是说这是一种好习惯,但如果 Tomcat 没有明确阻止线程创建的安全策略,您可以像在任何 Java 程序中一样在服务器端创建线程!?
    • @WizardOfOdds:我应该更具体一些。正如您提到的那样,当安全策略不允许它而不是在 EJB 中时,它是不允许的,但后者不适用于 Tomcat。无论如何,我不建议在服务器中使用线程。
    • 您可以通过超级采购您自己的 Thread.java 自定义实现来使 GWT 支持 java.lang.Thread,该实现只能在 GWT 中模仿您想要的任何行为。当你调用 Thread.start() 时,服务器将同时运行,客户端可以使用 Scheduler.get().scheduleRepeatingCommand / 任何你喜欢的。要编写可以与 gwt 共享的线程安全代码,您需要超级源代码一些类,至少像 ThreadLocal 和 ConcurrentHashMap。
    【解决方案2】:

    Web Workers 作为 HTML5 的一部分在许多浏览器中实现,但不是在所有浏览器(最显着的 Internet Explorer)中实现。您可以在可用的情况下使用这些功能,但您应该查看 javascript 编程模型。

    Javascript 通常异步工作。请求被触发,并且在某些时候它们的答案作为事件被接收。您可以同时拥有大量待处理的请求。不过,这将需要对您的系统进行一些重新设计。

    【讨论】:

      【解决方案3】:

      新方法是使用Scheduler

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-22
          • 1970-01-01
          • 2011-11-14
          • 2015-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多