Класс ThreadLocal<T>
- Параметры типа:
-
T- тип значения локальной переменной потока
- Прямые известные подклассы:
InheritableThreadLocal
public class ThreadLocal<T> extends Object
get или set) имеет свою собственную, независимо инициализированную копию переменной. ThreadLocal экземпляры обычно являются частными статическими полями в классах, которые хотят связать состояние с потоком (например, идентификатор пользователя или идентификатор транзакции). Например, класс ниже генерирует уникальные идентификаторы, локальные для каждого потока. Идентификатор потока назначается в первый раз, когда он вызывает ThreadId.get(), и остается неизменным при последующих вызовах.
import java.util.concurrent.atomic.AtomicInteger;
public class ThreadId {
// Atomic integer containing the next thread ID to be assigned
private static final AtomicInteger nextId = new AtomicInteger(0);
// Thread local variable containing each thread's ID
private static final ThreadLocal<Integer> threadId =
new ThreadLocal<Integer>() {
@Override protected Integer initialValue() {
return nextId.getAndIncrement();
}
};
// Returns the current thread's unique ID, assigning it if necessary
public static int get() {
return threadId.get();
}
}
Каждый поток удерживает неявную ссылку на свою копию локальной переменной потока, пока поток жив и экземпляр ThreadLocal доступен; после того как поток завершит работу, все его копии экземпляров локальных переменных потоков подлежат сборке мусора (если другие ссылки на эти копии не существуют).
- С:
- 1.2
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
ThreadLocal() |
Создаёт локальную переменную потока. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
T |
get() |
Возвращает значение в копии этой локальной переменной потока текущего потока. |
protected T |
initialValue() |
Возвращает "начальное значение" текущего потока для этой локальной переменной потока. |
void |
remove() |
Удаляет значение текущего потока для этой локальной переменной потока. |
void |
set |
Устанавливает копию этой локальной переменной потока текущего потока в указанное значение. |
static <S> ThreadLocal |
withInitial |
Создаёт локальную переменную потока. |
Подробное описание конструкторов
ThreadLocal
public ThreadLocal()
- См. также:
Подробное описание методов
initialValue
protected T initialValue()
get(), если поток ранее не вызывал метод set(T), в этом случае метод initialValue не будет вызван для потока. Как правило, этот метод вызывается не более одного раза на поток, но он может быть вызван снова в случае последующих вызовов remove(), за которыми следует get().- Требования к реализации:
- Эта реализация просто возвращает
null; если программист хочет, чтобы локальные переменные потоков имели начальное значение, отличное отnull, тогда либоThreadLocalможет быть подклассом и этот метод переопределен, либо методwithInitial(Supplier)может быть использован для созданияThreadLocal. - Возвращает:
- начальное значение для этой локальной переменной
- См. также:
withInitial
public static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier)
get на Supplier. - Параметры типа:
-
S- тип значения локальной переменной потока - Параметры:
-
supplier- поставщик, который используется для определения начального значения - Возвращает:
- новую локальную переменную потока
- Исключения:
-
NullPointerException- если указанный поставщик равен null - С:
- 1.8
get
public T get()
initialValue().- Возвращает:
- значение текущего потока этой локальной переменной
set
public void set(T value)
initialValue() для установки значений локальных переменных потоков.- Параметры:
-
value- значение, которое должно быть сохранено в копии этой локальной переменной потока текущего потока.
remove
public void remove()
initialValue(), если её значение не будет установлено текущим потоком в промежутке. Это может привести к нескольким вызовам метода initialValue в текущем потоке.- С:
- 1.5
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/ThreadLocal.html