2

質問:WorkerThread Java 1.2でバックグラウンドスレッド(このスレッドと呼びましょう)として実行されている長年の操作を強制終了するためのベストプラクティスを知りたいです。

シナリオ

具体的には、HTTP接続を確立するBlackberryデバイス用のアプリケーションを開発しています。全体像:バックグラウンドスレッド(WorkerThread)に転送された場合のURL要求。スレッドは要求を行い、コールバックを使用して結果を返します。

シナリオの詳細

現在、接続時にデータ接続は存在するが、何らかの理由(トンネルを介してドライブ)でその接続が存在しなくなるという状況が存在します。Blackberryの設計アーキテクチャの制限により、タイムアウトが2分に固定されているため、実際の接続はハングします。その結果、比較的(15秒)長期間ハングしている接続を強制終了する必要があります。

私の現在の解決策-2Theads?

現在の私の現在の解決策は、WorkerThread別のスレッド内で実行することです(この新しいスレッドと呼びましょうMonitorThead)。MonitorThread開始WorkerThreadし、1000ミリ秒間スリープしてから、WorkerThreadまだ生きているかどうかを定期的にチェックします。15秒後もWorkerThreadがまだ生きている場合、MonitorThreadはWorkerThreadをスリープ状態にして終了します。これは本当に最善のアプローチですか?

質問とキーポイントの要約

要約すると、以下は主要な質問とその質問に関連する重要な制約です。乾杯!

特定の操作でスタックしているJavaバックグラウンドスレッドを正常に強制終了するにはどうすればよいですか?

シナリオの制約:

  • 操作を一時停止し、スレッドが要求した状態を確認する制御はありません
  • BlackberryによるJavaME1.2とその スレッドAPIの実装に固有であるため、明示的な kill()メソッドはありません。
  • ベストプラクティスと、保持スレッドを最も安全に強制終了する方法について最も懸念しています。

フォローアップ/編集
NeilCoffeyは、接続オブジェクトへの参照を保持し、代わりにそのオブジェクトでclose()を呼び出すことをお勧めします。私は現在これを調べています...

4

3 に答える 3

2

スレッドを強制終了する方法は難しい質問です。スレッドを停止または中断できる保証された方法はありません。ただし、現在のアーキテクチャを使用してタイムアウトした場合は、(接続ではなく)ストリームを閉じるだけで、I/OでスタックしているスレッドでI/O例外が発生するはずです。IOExceptionが発生しない場合は、少なくとも読み取りまたは書き込みがEOFで返される必要があります。

JavaDocが言うように、接続を閉じても役に立たないことに注意してください。

開いているストリームがあると、それら自体が閉じられるまで接続が開いたままになります。

接続から派生したストリームを閉じる必要があります。

于 2009-05-08T02:20:03.650 に答える
1

通常、ベストプラクティスは、接続を閉じてから、その結果をスレッドに波及させて、スレッドを正常に終了できるようにすることです。

どのように接続していますか?タイムアウトするのを待つのではなく、強制的に閉じる可能性はどのくらいありますか?接続オブジェクトを取得できますか?Blackberryには、特定の接続を切断するために実行できる他のコマンドがありますか?

于 2009-05-08T02:20:34.973 に答える
0

アトミックトランザクションでバックグラウンドスレッドにフラグを渡すことが、スレッドに停止を要求する最良の方法であると常に信じていました。しばらく止まらない場合は、殺してください。

それに加えて、2分が長い時間だと思うなら、それはあなたにとって良いことです。キャンセルボタンを使って、何が長いかをユーザーに判断させます。

于 2009-05-08T14:56:46.083 に答える