0

ソケットプログラミングにJavaを使用しています。2つの動的スレッドセットを使用しています。

最初にクライアント要求を受け入れます...クライアントごとに動的にスレッドを作成します

try (ServerSocket listener = new ServerSocket(1000)) {
   while (true) {
   Socket socket = listener.accept();
   logger.debug(socket.getRemoteSocketAddress().toString() + " Has joined :::");
   new ThreadPool(socket).start();
  }
}

2つ目は、送信するクライアントパケットを受け入れ、クライアントデータを解析するための新しいスレッドを作成することです。

public void run() { // this run() in ThreadPool class
    while (true) {
    new parserThread();//creating new thread for parsing information
   }
}

しかし、私の問題は、24時間後にアプリケーションがスタックし、コンソールに何も印刷されないことです。なぜそれが行き詰まっているのかはわかりませんが、私のコーディングアプローチにはほとんど疑問がありません。それらが可能かどうか教えてください。

  1. 別の動的スレッドでスレッドを作成しています。
  2. スレッド名の割り当ての問題は、次のように増加しているためです。

    549790[スレッド-17569]
    549791[スレッド-17570]
    549792[スレッド-17571]

  3. Log4jコンソールアペンダーの問題。
私が間違っている場合は訂正してください。CountDownLatchを使用したExecutorServiceは、それよりも優れたアプローチですか?ありがとうございます

4

1 に答える 1

1

標準のJREインストールのユーティリティを使用jstackして、Javaアプリケーションを実行するためのスタックトレースを取得できます。スタックトレースは、アプリケーションがスタックした場所を正確に示します。複数のスレッドを使用すると、どこかでデッドロックが発生する可能性があります。

于 2013-02-11T07:28:41.280 に答える