0

私の netty サーバーでは、次のようにスレッドプールを作成します。

    ChannelFactory factory =
        new NioServerSocketChannelFactory(
            Executors.newCachedThreadPool(threadFactory),
            Executors.newCachedThreadPool(threadFactory);

サーバーが一定数の接続を処理した後、後続の接続が前のスレッドの 1 つが終了するのを待つことに時々気付きました。

newCachedThreadPool のドキュメントから、スレッド プールが必要に応じて新しいスレッドを作成すると仮定していました。以前の接続が終了するまで一部の接続がブロックされている理由を誰かが理解するのを手伝ってくれませんか? 既存のすべてのスレッドがビジーであるため、netty は新しい接続用の新しいスレッドを作成しませんか?

これを修正するにはどうすればよいですか?

どんな助けでも大歓迎です!

4

1 に答える 1

1

無制限の共有キューで動作する固定数のスレッドを再利用するスレッド プールを作成します。

どの時点でも、最大で nThreads スレッドがアクティブな処理タスクになります。

すべてのスレッドがアクティブなときに追加のタスクが送信されると、それらのタスクは、スレッドが使用可能になるまでキューで待機します。シャットダウン前の実行中に障害が発生していずれかのスレッドが終了した場合、必要に応じて後続のタスクを実行するために新しいスレッドが代わりに使用されます。

プール内のスレッドは、明示的にシャットダウンされるまで存在します。

newCachedThreadPool の Oracle Java Doc から!

したがって、スレッド番号は Executors.newCachedThreadPool によって修正されます

netty のデフォルト番号は processor_number *2

:)

于 2013-09-13T02:55:49.740 に答える