ThreadLocal类用于创建只能由同一个线程读取和写入的线程局部变量。 例如,如果两个线程正在访问引用相同threadLocal变量的代码,那么每个线程都不会看到任何其他线程操作完成的线程变量。
线程方法
以下是ThreadLocal类中可用的重要方法的列表。
编号 | 方法 | 描述 |
---|---|---|
1 | public T get() | 返回当前线程的线程局部变量的副本中的值。 |
2 | protected T initialValue() | 返回此线程局部变量的当前线程的“初始值”。 |
3 | public void remove() | 删除此线程局部变量的当前线程的值。 |
4 | public void set(T value) | 将当前线程的线程局部变量的副本设置为指定的值。 |
实例
以下ThreadLocalTest 程序演示了ThreadLocal类的上面一些方法。 这里我们使用了两个计数器(counter)变量,一个是常量变量,另一个是ThreadLocal变量。
package ThreadMethod;
/*
* public T get() 返回当前线程的线程局部变量的副本中的值。
2 protected T initialValue() 返回此线程局部变量的当前线程的“初始值”。
3 public void remove() 删除此线程局部变量的当前线程的值。
4 public void set(T value) 将当前线程的线程局部变量的副本设置为指定的值。
*/
class RunnableTest implements Runnable {
int counter;
ThreadLocal<Integer> threadLocalCounter = new ThreadLocal<Integer>();
public void run() {
counter++;
if (threadLocalCounter.get() != null) {
threadLocalCounter.set(threadLocalCounter.get().intValue() + 1);
} else {
threadLocalCounter.set(0);
}
System.out.println("Counter: " + counter);
System.out.println("threadLocalCounter: " + threadLocalCounter.get());
}
}
public class ThreadLocalTest {
public static void main(String args[]) {
RunnableTest commonInstance = new RunnableTest();
Thread t1 = new Thread(commonInstance);
Thread t2 = new Thread(commonInstance);
Thread t3 = new Thread(commonInstance);
Thread t4 = new Thread(commonInstance);
t1.start();
t2.start();
t3.start();
t4.start();
// wait for threads to end
try {
t1.join();
t2.join();
t3.join();
t4.join();
} catch (Exception e) {
System.out.println("Interrupted");
}
}
}
以DEBUG方式按步骤运行
Counter: 1
threadLocalCounter: 0
Counter: 2
threadLocalCounter: 0
Counter: 3
threadLocalCounter: 0
Counter: 4
threadLocalCounter: 0
网友评论