0

を長時間実行中のJavaスレッドを中断しますが、私の状況です:どのように私はThreadPoolExecutor。ここ

私は、そのThreadの私がSSLを介してサーバへのHTTP呼び出しを行う上でThreadPoolExecutorを持っています。場合によっては、NullPointerExceptionを取得することがあります。なぜなら、クライアントはサーバーの応答を復号できず、スレッドはプール内のライブロックを無期限に停止させるだけです。誰かがプール内の特定のスレッドを対象にして、実行中の時間を確認し、3分間以上実行している場合は中断/中断するための良い方法を知っていますか?

+3

私の提案は、NullPointerExceptionを修正することです。このような例外は、バグの明確な兆候です。それは起こるべきではありません。そして、それが起こっても、それはちょうどタスクを中止する必要があります。詳細については、いつものように、例外のコードとスタックトレースを投稿してください。 –

+0

例外はこのライブラリから来ていますhttps://java.net/projects/http-clientはい私はそれがバグかもしれないことは知っていますが、とにかく私のプロジェクトをJava 9に移行させてしまい、HTTPクライアントを持っていますおそらく同じです)焼き付けられました。私はバグを報告することに取り組みたいと思います。今私は物事をピンチで終わらせなければならない。そのうえで、私はとにかくスレッドを制御したいと思っています。 – impeto

+0

何か不足しているかもしれませんが、そのライブラリからNPEを取得した場合、コントロールはコードに戻っています。なぜなら、クリーンアップ(もしあれば)を実行して実行ブロックを終了できないのですか? – zeppelin

答えて

0

そのスレッドへの参照を保持している場合は、そのスレッドに割り込み()メソッドを呼び出して中断することができます。例えば:

Thread t = new Theard(r); 
t.interrupt(); 

あなたはメソッドがトリガされた開始時点からの経過時間をカウントすることができますAOP Springと

(Rは、ジョブ、実行可能です)。

別の解決策は独自のスレッドファクトリを使用することです。工場では、3分後に各スレッドを確実に中断してください。

別のアプローチは、使用することです。ScheduledThreadPoolExecutorの

は、一定の期間のために実行するようにタスクを設定、それが1つの実行後に正常に終了しましょう。

+0

私はすでにThreadPoolExecutorを拡張していて、before/afterExecuteメソッドをオーバーライドしていますが、ハッキーになり、結合されているように感じます。誰かがより洗練された解決策を得ることを望んでいました – impeto

+0

スレッド工場では、後でスレッドを中断する3分のタイマーを追加することができます。 –

+0

はい、 'ThreadFactory'では' Thread'が作成された時しか設定できません。私はそれぞれの仕事が始まる時を設定する必要があります。 – impeto

関連する問題