8

Javaと並行性について質問があります。

'a'というThreadLocal変数があるとしましょう。そして、CachedThreadPoolを使用して新しいスレッドを取得します。スレッドが再利用されると、ThreadLocal変数'a'はどうなりますか?同じ値を維持しますか(同じスレッドであるため)、または空で開始します(スレッドが新しいかのように)?

4

3 に答える 3

11

デフォルトでは、ThreadLocals はスレッドとともに再利用されます。それらを再初期化する必要がある場合は、以下に示すメソッドをオーバーライドすることで実行できます。

java.util.concurrent.ThreadPoolExecutor の javadoc から

フック メソッド このクラスは、各タスクの実行の前後に呼び出される、保護されたオーバーライド可能な beforeExecute(java.lang.Thread, java.lang.Runnable) および afterExecute(java.lang.Runnable, java.lang.Throwable) メソッドを提供します。これらは、実行環境を操作するために使用できます。たとえば、ThreadLocals の再初期化、統計の収集、ログ エントリの追加などです。さらに、Executor が完全に終了した後に実行する必要がある特別な処理を実行するために、terminated() メソッドをオーバーライドできます。フックまたはコールバック メソッドが例外をスローすると、内部ワーカー スレッドが失敗し、突然終了する可能性があります。

于 2011-09-13T15:02:02.603 に答える
5

リフレクションを使用して、スレッドのスレッド ローカル プールをクリアできます。できるよ

public static void clearAllThreadLocals() {
    try {
        Field threadLocals = Thread.class.getDeclaredField("threadLocals");
        threadLocals.setAccessible(true);
        threadLocals.set(Thread.currentThread(), null);
    } catch (Exception e) {
        throw new AssertionError(e);
    }
}
于 2015-07-30T14:36:17.753 に答える
3

スレッドがプールに返された場合、ThreadLocal 変数は引き続きスレッドにアタッチされます。プールで ThreadLocals を使用する場合は、スレッドがプールから引き出されるときに設定し、返される前に設定解除できるように注意する必要があります。

于 2011-09-13T15:01:19.407 に答える