1

複数のスレッドで小さなサーバーをプログラムしました。数時間後(現在、問題を再現できないと言われています)、サーバーは動作を停止します。私のコードは次のようになります。

スレッド2:

while(true)
{

                System.out.println("Point 1");
                Socket abc = serverSocket.accept();
                System.out.println("Point 2");
                connection = true;
}

Thread1は、Thread.sleep(1000)ループで待機し、接続がtrueであるかどうかを確認します。そうである場合は動作を開始し、そうでない場合は「待機中」と出力します。接続が中止されると、接続がfalseに設定されます。

これで、メインプログラムがサーバーに接続します。サーバーは、待機中(接続が確立されるまでなど)のポイント1ポイント2を出力します。

これで、数時間実行した後でも、クライアントは接続できます。接続が確立されたと表示されます(clientSocket = new Socket(inetAddress、Integer.parseInt(port));このコマンドが例外なく成功した場合に接続が確立されたと見なされます)。

Thread1を数時間実行した後、クライアントに接続する頻度に関係なく、「待機中」、「待機中」のみが出力されます。それは数時間の実行後にのみ発生するため、私はそれに困惑しています。JavaバージョンはJavaバージョン"1.7.0_07"です。Java(TM)SEランタイム環境(ビルド1.7.0_07-b10)このバージョンに既知の問題はありますか、またはどこに間違いがある可能性がありますか?エラーを再現する方法の手がかりはありますか?

手伝ってくれてありがとう。

4

2 に答える 2

0

フィールドへのアクセスを同期せconnectionず、フィールドではない場合volatile、1つのThread1はconnection、Thread2で変更されたものを認識しない可能性があります。これがJavaメモリモデルの仕組みです。

于 2012-11-22T22:14:35.823 に答える
0

私はついに問題を解決しました。そのコードがあれば十分です

InetAddress inetAddress = InetAddress.getByName("0.0.0.0");
serverSocket = new ServerSocket(39999,0,inetAddress);

そして私のクライアントは接続されていると言います。次のようなコードは必要ありません

Socket neuSocket = serverSocket.accept();

whileループからのcatch-blockが原因で、スレッド全体が終了しました。Javaは時々非常に混乱します。スレッドがServerSocketの宣言で停止した場合、そのソケットでそれ以上リッスンすることはできません。

于 2012-11-24T13:31:35.887 に答える