Java Кэшированный пул потоков и локальный поток - PullRequest
7 голосов
/ 13 сентября 2011

У меня есть вопрос о Java и параллелизме.

Допустим, у меня есть переменная ThreadLocal, которая называется a. И я использую CachedThreadPool для получения новых потоков. Когда поток восстанавливается, что происходит с переменной ThreadLocal? он имеет то же значение (потому что это тот же поток) или он начинается пустым (как если бы поток был новым)?

Спасибо

Ответы [ 3 ]

10 голосов
/ 13 сентября 2011

По умолчанию ThreadLocals повторно используются вместе с потоком.Если вам требуется их повторная инициализация, вы можете сделать это, переопределив методы, указанные ниже:

из javadoc для java.util.concurrent.ThreadPoolExecutor

Методы подключения Этот класс предоставляет защищенные переопределяемые методы beforeExecute (java.lang.Thread, java.lang.Runnable) и afterExecute (java.lang.Runnable, java.lang.Throwable), которые вызываются до и после выполнениякаждой задачи.Их можно использовать для манипулирования средой исполнения;например, повторная инициализация ThreadLocals, сбор статистики или добавление записей журнала.Кроме того, метод terminated () может быть переопределен для выполнения любой специальной обработки, которая должна быть выполнена после полного завершения Исполнителя.Если методы перехвата или обратного вызова генерируют исключения, внутренние рабочие потоки могут, в свою очередь, завершиться с ошибкой и внезапно завершиться.

4 голосов
/ 30 июля 2015

Вы можете очистить локальный пул потока для потока, используя отражение. Вы можете сделать

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);
    }
}
3 голосов
/ 13 сентября 2011

Если поток возвращается в пул, переменная ThreadLocal все равно будет присоединена к нему. При использовании ThreadLocals с пулами вы должны быть осторожны, чтобы иметь возможность установить, когда поток извлекается из пула и сбрасывается перед его возвратом.

...