2012-04-29 70 views
0

我正在開發一個服務器需要向多個客戶端發送(每秒)值的系統。我的想法是爲每個客戶端實現一個單獨的線程來完成此操作。我實現了線程以下列方式:GWT(服務器端)多線程可能

Runnable tu = new TimeUpdater(market_id); 
Thread thread = ThreadManager.createBackgroundThread(tu); 
thread.start(); 

public class TimeUpdater implements Runnable{ 
boolean close = false; 
.. 
    public void run() { 
     while(!close){ 

     try { 
     //do something  
     Thread.sleep(1000); 
     }catch (InterruptedException e) { 
     } 

     } 
    } 
} 

要暫停的話就用主題:

thread.interrupt(); 
thread = null; 

但我就是不能讓暫停/恢復的線程工作。 有沒有人有更好的想法在服務器上使用GWT多線程?

錯誤地編輯了原文。 - 馬丁

+1

gwt serverside是一個矛盾(有點)。 gwt編譯運行在客戶端上的javascript。 –

+0

@ antony.trupe它不是錯誤或矛盾,GWT包括服務器端組件做遠程處理等 –

回答

0

首先,後臺線程需要這些進程在後端運行。爲了做到這一點,你必須發送一個任務到後端,在那裏你已經在運行任務,所以添加線程只是你的應用程序的更多延遲。你實際上並不需要線程來發送消息;後端請求持續10分鐘。此外,你的線程將在他們自己的請求中運行;你可以存儲在靜態RAM線程的列表,以便能夠訪問他們,但更好的方法是爲他們在分發郵件,而不是保持實例在線和睡眠。如果您的客戶端發送消息到服務器每秒,其他用戶需要的是RPC正好可以鍵查詢通知,並立即發送郵件。如果您使用異步數據存儲過程,它將非常快速。另外,如果你想減少請求次數,你可以有RPC啓動消息發送,然後讓這個servlet得到的回答,然後敲定異步請求後,回覆已經下降了線。

我使用ThreadLocal映射和清理過濾器像這樣進行後處理。 Servlet將作業發佈到可運行列表,並且清理過濾器運行作業。只要您立即開始異步請求,它們通常在清理過濾器到達它們時完成。

https://developers.google.com/appengine/docs/java/datastore/async

+0

我對庫將使用自定義允許容易多線程工作,java.lang.Thread中的超級來源小類它會像中的AppEngine和Java環境正常線程,並且在GWT客戶幾乎像正常的線程。當它被髮布時,我會發佈一個鏈接到你的源代碼。 – Ajax

1

我很抱歉地說,但我相信谷歌應用程序引擎不允許多線程。例如,請參閱here