0

(com.corundumstudio.socketioの)netty実装に基づいたJava socket.ioサーバーがあります。

サーバーはクローズドソース コードを使用してリクエストを処理しますが、場合によっては、リクエストが無期限に停止することがあります。

大きな問題は、リクエストが同期された{}ブロック内でスタックしてリソースを保持し続け、他のリクエストを処理できなくなったときに始まります。{}

アプリケーション全体を停止しないように、特定のスレッドを停止/強制終了するオプションを追加したいと思います。

Thread.stop() は非推奨であり、netty では ThreadDeath 例外をキャッチして無害な警告メッセージに変換するため、明らかに netty では機能しません...

難しいコードが閉じられているため、割り込みフラグを追加することはできません。

この点で堅牢になるようにサーバーを実装する良い方法は何ですか?

4

1 に答える 1

1

言うまでもなく、本当に必要なことは、同期されたリソースの問題を把握して修正することです。スレッドを強制終了しても、最終的には実際に仕事が完了するわけではないからです。リソースについて何も知らなければ、その特定の点についてアドバイスすることはできません。

当面の間、同期ブロックに到達するために各スレッドが取得する必要があるReentrantLockで問題のあるコード セグメントをラップすることをお勧めします。事実上、同期動作 (スレッドを引き出すことはできません) を、同じ保護プロパティを持つロックに置き換えていますが、取得スレッドをタイムアウトにすることができます (スレッドが積み重なって停止しないようにします)。システム) にtryLock(long timeout, TimeUnit unit)を使用してロックを取得させることにより、適切なタイムアウトで。ReentrantLock には、「インスツルメンテーション」の層もあります。これにより、ロックで待機しているスレッドの数を特定し、スレッド自体への直接参照を取得できます。最後のポイントは、待機中のスレッドを中断できるため、役に立ちます。 * stop *ping それらの代替として. 待機中のスレッドが中断されると、中断された例外がスローされ、完全に合法的で非推奨の方法で続行されます。

一部の純粋主義者の怒りを引き起こすリスクを冒して、注意を払うことをお勧めしますが、同期ポイントが既にブロックされている場合に false を返すsun.misc.Unsafe.tryMonitorEnterを使用して、他のスレッドが同期ブロックに入らないようにすることができます。

于 2013-04-30T10:26:13.883 に答える