2

私のシナリオは次のとおりです。

リクエストごとに指定されたタイムアウト期間内にタイムアウトまたは応答を生成する必要があるサーバーを実装しています。したがって、各要求にはサーバーの観点からの応答が保証されます(もちろん、応答はトランスポート層の障害などのためにクライアントに到達しない可能性があります...)。

上記のセマンティクスを実装するために、各リクエストはスレッドを生成し(実際には、スレッドプールから利用可能なスレッドを取得します)、同期オブジェクトの通知を介してその応答を待ちます。待機期間は、オブジェクトの待機メソッドに送信されるタイムアウトパラメータによって制限されます。生成されたスレッドは、リクエストの処理方法を実際に知っているオブジェクトにリクエストを委任します。このオブジェクトの呼び出しAPIは既知ですが、呼び出しが無期限にハングしないことを指定する既知のサービスレベルアグリーメントはありません。(具体的には、私の場合、サーバーは実際にはCORBAクライアントですが、それは重要ではありません。)

さて、私が興味を持っているのは、現在メソッド呼び出しでブロックされているにもかかわらず、そのスレッドが応答していないことを何らかの方法で検出し、それを強制終了(中断)する方法があるかどうかです。

ちなみに、私はスレッドオブジェクトへの参照を保持し、事前に指定された時間が経過した後、そのinterrupt()メソッドを呼び出すことができることを知っています。残念ながら、それは「割り込み」セマンティクスを保証しません...

Javaスレッドプリミティブの非推奨

皆さんありがとう

4

2 に答える 2

3

あなたがinterrupt()セマンティクスに頼ることができないなら、あなたは運が悪いかもしれないと思います。スレッドを強制的に終了する信頼できる安全な方法はありません。どの言語でも危険です。

たとえそれが回避されたとしても、interrupt()があなたに必要なものを手に入れることを願っています。CORBAコールは、標準のネットワーククラスを通過する必要があるため、ブロッキングコールを適切に中断する必要があります。

これは、完全な子プロセスを生成することなく実行できる最善の方法です。

于 2009-12-22T19:03:25.850 に答える
2

ExecutorServiceを使用して、実際のビジネスロジックがCallableで実行されるようにしてください。ExecutorServiceによって返されるFutureにはget()があり、待機時間を指定できます...

于 2009-12-22T18:48:02.033 に答える