2011-08-09 9 views
0

私はポートに座ってクライアント接続を待ち受けるアプリケーション(サーバー側)を持っています。 接続が確立すると、アプリケーションはその接続を処理するパーサー(別のスレッド)を起動します。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; 
} 

それ以外のクラスには、セッターとゲッターがたくさんあります。

パーサーはこのオブジェクトのインスタンスをプライベートフィールドとして持っています。

どうすればいいですか?

+0

スレッドを作成して変数をチェックする際のコードを表示してください。 – DaveJohnston

+0

2つのパケットペアが同じセッションにあるべきですか?同じセッションにいる場合は、会話のようなものを作成する必要があります。つまり、SessionInfoはConversationInfoのようになり、複数のインスタンスが存在するはずです。 – tkr

答えて

2

パーサーはこのオブジェクトのインスタンスをプライベートフィールドとして持っています。

これは問題です。解決策は、新しいSessionInfoを作成し、それをメソッド引数としてパーザに渡し、さらなるメソッド呼び出しに渡すことです。これを行うと、セッション状態への参照は現在のスレッドの実行に対してローカルになります。

パーサーには、解析中に更新されるより多くのプライベート属性が含まれている場合は、これらも抽出する必要があります。それらをプライベートなサブクラスで結合し、解析するために呼び出されたときにそのクラスのインスタンスを作成することは、その問題の可能な解決策になります。

2

2つの別々のスレッドが2つの別個のSessionInfoインスタンスを使用していることを確認する必要があります。

これを行う最も簡単な方法は、新しいパーサーインスタンスを作成して新しいSessionInfoインスタンスを作成することです。彼らが別のインスタンスを持っていることを確認したら、あなたはうまくいくはずです。

関連する問題