1

ソケットを介してクライアントと通信するJavaサーバーアプリケーションがあります。すべてのクライアント要求は新しいスレッドで処理されます。しかし、いくつかのリクエストでは、2 つのクライアントを同期する必要があります。

例:

  • クライアント A がサーバー S にリクエストを送信します。
  • S 上のスレッド S1 は、A の要求を受け入れます。
  • S1 はクライアント B にこのリクエストについて通知します (GoogleCloudMessaging 経由)。
  • S1 は今すぐブロックする必要があります
  • クライアント B は S から情報を受け取り、S に要求を送信します。
  • S 上のスレッド S2 は、B の要求を受け入れます。
  • S1 を今すぐリリースし、S2 からメッセージを取得する必要があります
  • S1 はクライアント A に応答を送信します

ロック条件メカニズムについては知っていますが、スレッドを作成するときの条件がわからないため、ここでは機能しません。次のようなものが必要です:

// Pseudo Code
// on the S1 Thread, first argument beeing a signal ID, second a timeout
s1.waitForSignal("clientB", 10000);
// and on the S2 Thread to continue S1
SignalSender.send("clientB");

Javaでこのようなことは可能ですか? 私の問題に対する他の解決策はありますか?

4

1 に答える 1

0

waitあなたの問題は、 /を呼び出すことができる共有参照がないことですnotify(使用できる共有ロック条件は言うまでもありません)。

まず第一に、これらの 2 つのスレッド間で既に共有されているものがあります。つまり、あなたの場合は string"ClientB"です。これがあれば、その文字列を両方のクラスからアクセスできる場所にある単一の参照にマップするだけです。

最も単純な実装は、静的なマップ フィールドをどこかに保持し、何らかの方法で監視オブジェクトで埋めることです。

public final class Monitors {

    private Monitors() {}

    private static final Map<String, Object> monitors = new HashMap<String, Object>();

    static { monitors.put("ClientB", new Object()); }

    public static Object get(String key) { return monitors.get(key); }

}

もちろん、このマッピングを管理し、内部でロックと条件を使用する適切なサービスを作成することもできます。また、待機機能とシグナリング機能をサービス自体にカプセル化し、次のように使用することをお勧めしますmonitorService.waitForSignalsFrom("ClientB")

于 2013-07-22T19:50:54.757 に答える