私はポートに座ってクライアント接続を待ち受けるアプリケーション(サーバー側)を持っています。 接続が確立すると、アプリケーションはその接続を処理するパーサー(別のスレッド)を起動します。Javaスレッドのデータ共有を停止しますか?
私の問題は、他の処理中にサーバアプリケーションが新しいスレッドを起動することがある点です(解析に時間がかかるため)。これは望ましい動作であり、それ自体は問題ではありません。何が起こるかは、新しいスレッドが古いスレッドから状態変数を読み込んでいるように見えて、誤って動作することです。
緩く、パーサーは次のとおりです。 クライアントは常に2つのパケットを送信します。第1のパケットは基本的にノックノックパケットであり、第2のパケットは実際のデータパケットである。 私は最初を読んで、それを受け入れることに決めたら、それを変数に入れて、次のパケットを読むことができるようにします。
説明文では、最初のスレッドはノックノックパケットを読み取り、それを検証します。 次のパケットが(同じスレッド上に)到着し、解析が開始されます。
一方、別のパーサーが作成され、最初のパケットを待機します。 何が起こるか(問題は)、検証変数(このスレッドでは偽であるはずです)をチェックし、それがOKであることを確認します(まだ実行中の前のスレッドから読み込みます)。あたかもそれがデータパケットであるかのようにノックノックパケットをノックする。
lokoing forは、データ共有を完全に排除する方法です。次のクラスを使用してセッション状態を把握しています:
public class SessionInfo {
private Constants.PacketValidity validity;
private int packetSize;
private String IMEI;
private int packetReportedSize;
private Constants.PacketType packetType;
private int codec;
private int records;
private boolean valid;
private Constants.ResponseType responseType;
private String clientIP;
private int serverPort;
private Date parseInit;
private Date parseEnd;
}
それ以外のクラスには、セッターとゲッターがたくさんあります。
パーサーはこのオブジェクトのインスタンスをプライベートフィールドとして持っています。
どうすればいいですか?
スレッドを作成して変数をチェックする際のコードを表示してください。 – DaveJohnston
2つのパケットペアが同じセッションにあるべきですか?同じセッションにいる場合は、会話のようなものを作成する必要があります。つまり、SessionInfoはConversationInfoのようになり、複数のインスタンスが存在するはずです。 – tkr