2010-04-07 43 views
46

據我所知,GWT應用程序的整個客戶端在構建時轉換爲Javascript,因此我想這個問題與Javascript和GWT提供的可能性有關。在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). 

或預定「多線程」任務,這是什麼意思?

+1

的贊成票是不是它是否是一個有用的問題的指示,而是如果問題是*寫得很好*,包括一個清晰的描述,提供詳細信息以及某些跡象表明作者已經試圖自行尋找答案。現在,我**不是**,說你的問題不符合這些要求,只是解釋瞭如何提出問題和答案是不同的。 – 2014-03-19 01:04:36

回答

34

JavaScript不支持多線程。然而,GWT有一個「模擬」線程的類,這不是真正的多線程,但在大多數情況下,你需要:com.google.gwt.core.client.Scheduler.ScheduledCommand。該技術基於計時器類,該計時器類在給定的時間過去後執行方法。

例如,將下面的代碼時,你自己的代碼,該scheduleDeferred方法將直接返回,並同時使用定時器執行​​方法你的代碼繼續命令後,:

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更新。

+1

糾正我,如果我錯了,但 - 我可以在服務器端使用Java線程,更正?如果這是正確的,那麼我認爲你的答案對我有很大幫助,因爲我認爲我可以在客戶端的DeferredCommand和服務器端的Java Threads上重新設計我的系統。 – Federer 2010-04-07 12:53:17

+0

很可能你不能在服務器本身中使用線程,因爲服務器不允許創建線程。但是從瀏覽器到服務器的每次調用都會啓動一個'線程',而且如果你想啓動一個與瀏覽器調用無關的進程,或者你不希望調用來自一個線程,瀏覽器等待來自服務器的答案。但總的來說,這一切都取決於你想要對你的應用程序做什麼。 – 2010-04-07 13:39:11

+2

你是什麼意思*「服務器不允許創建線程」*?哪臺服務器?我並不是說這是個好習慣,但如果Tomcat沒有明確禁止線程創建的安全策略,那麼您可以在服務器端創建線程,就像在任何Java程序中一樣! – SyntaxT3rr0r 2010-04-13 16:27:13

0

JavaScript不支持多線程,因此無論GWT如何,多線程只能在服務器端完成,因爲GWT只能使用客戶端已有的功能。

3

Web Workers的工作是作爲HTML5的一部分,它是在許多瀏覽器中實現的,但不是所有瀏覽器(最顯着的是Internet Explorer)。你可以在可用的地方使用這些功能,但你應該做的是看看javascript編程模型。

JavaScript通常工作異步。請求被解僱,並在某個時候將他們的答案作爲事件接收。您可以同時擁有大量待處理的請求。這需要對系統進行一些重新設計。