0

サーバーが (毎秒) 値を複数のクライアントに送信する必要があるシステムを開発しています。私の考えは、これを行うためにクライアントごとに単一のスレッドを実装することでした。次の方法でスレッドを実装しました。

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でマルチスレッドを使用するより良いアイデアはありますか?

元の投稿を誤って編集しました。- マーティン

4

2 に答える 2

1

申し訳ありませんが、google-app-engine ではマルチスレッドが許可されていないと思います。たとえば、ここを参照してください。

于 2012-04-29T23:07:40.827 に答える
0

まず、バックグラウンドスレッドでは、これらのプロセスがバックエンドで実行されている必要があります。これを行うには、タスクをバックエンドに送信する必要があります。バックエンドでは、すでに実行中のタスクが実行されているため、スレッドを追加すると、アプリのレイテンシが長くなります。メッセージをディスパッチするために実際にスレッドは必要ありません。バックエンドリクエストは10分間続きます。また、スレッドは独自のリクエストで実行されます。スレッドのリストをスタティックRAMに保存してアクセスできるようにすることもできますが、より良い解決策は、インスタンスをオンラインにしてスリープ状態に保つのではなく、メッセージが届いたときにメッセージを配布することです。クライアントが毎秒サーバーにメッセージを送信する場合、そのrpcは、他のユーザーに通知する必要があるキークエリを実行し、メッセージをすぐに送信できます。非同期データストアプロセスを使用する場合、非常に高速になります。また、リクエスト時間を短縮したい場合は、

ThreadLocalマップとクリーンアップフィルターを使用して、このような後処理を行います。サーブレットは実行可能なリストにジョブを投稿し、クリーンアップフィルターがジョブを実行します。非同期リクエストをすぐに開始する限り、多くの場合、クリーンアップフィルターがそれらに到達するまでに実行されます。

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

于 2012-04-30T17:12:59.753 に答える