2016-08-18 9 views
0

問題: ThreadのrunメソッドでRunTimeExceptionがスローされたときに、そのスレッドのスレッドローカルが保持されることを知りたかったですか?この質問への答えは、私が以下で求めていることにあります。つまり、スレッドが死んだ場合(例外がスローされた場合)、スレッドのローカルスナップショットgetはクリアされます。プログラムでそれを処理する必要はありますか? シナリオ: 負荷が高いときに要求が送信され、処理に時間がかかり、応答が作成される前に非同期コンテキストがタイムアウトしました。このシナリオではどうなりますか?要求を処理しているスレッドはどうなりますか?ThreadPoolExecutorでスレッドが終了するタイミング

詳細はこちら 私はThreadPoolExecutorsが内部的にどのように機能するかを研究しています。私が知りたいことは、スレッドのrunメソッドでRunTimeExceptionがスローされたときに起こることです。それは殺され、ThreadPoolExecutorはまったく新しいスレッドを作成しますか?または、JVMは何とかそのスレッドが死ぬことを許さないので、プール内で に再利用できるようになります。私はスレッドが死ぬと思うので、それはThreadLocalスナップショットです。 ThreadPoolExecutorが例外を処理する方法と、特定のスレッドのライフサイクルがその周りをどのように回転するかについて、いくつかの洞察を得たいと思っていました。 ご協力いただきありがとうございます!

+1

は、なぜあなたは、このような実装の詳細を気にしていますか?インターフェイスではなく、実装について心配しています。あなたが本当に気にしているのであれば、自分でコードを掘り下げてください。 StackOverflowは、あなたが抱えている問題について質問するためのものです。 JDK内のすべてのモジュールの実装を中断するのは、問題によるものではなく、奇妙なものです。これは予期せぬ結果や説明できない結果につながる問題に助けを求めるサイトです*。 –

+0

* "ThreadPoolExecutorsが内部的にどのように動作するかを研究しています。" * - 私はあなたがJDKに同梱されているソースコードを読んだことを前提としています。ソースのどの部分に問題がありましたか? – the8472

+0

これはrunWorkerメソッドのソースコードにあります。 –

答えて

0

ありがとうございました!私は私の答えを得た。

例外がスローされたときにスレッドが停止します。ここでしかキャッチしないのは、スレッドクリアが正しくクリアされない場合にスレッドリークを引き起こすスレッドローカルのスレッドIDを参照する場合です。

スレッドIDは、Javaドキュメントごとに再利用できます。私の場合は、スレッドID(Thread.currentThread.getId)へのスレッドローカル参照のいくつかを入れていました。これをクリアする最善の方法は、afterExecute(java.lang.Runnable、java.lang.Throwable)をオーバーライドして、そこにあるものをクリーンアップすることです。 Javaのドキュメントから

public long getId() 
    Returns the identifier of this Thread. The thread ID is a positive long number generated when this thread was created. The thread ID is unique and remains unchanged during its lifetime. When a thread is terminated, this thread ID may be reused. 
関連する問題