上一篇文章主要针对用volatile关键字定义多线程之间共享变量的问题。这里基本上是一个相反的情况。在多线程编程中,有时每个线程需要自己专用的变量。与其说是变量,其实是用定义一个特殊对象(ThreadLocal)来实现的。这些ThreadLocal变量只能在线程内在线程结束之前有效,一旦线程结束,变量值也就随之消失。
看下边的例子:
import java.util.Random;
public class MyLocalThread {
// 定义thread local variable
static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>();
// 用于生成随机数字
static Random random = new Random();
// 显示thread local variable 和 thread name
private static void displayValues()
{
System.out.println( "Thread Name:" + Thread.currentThread().getName() +
", /t the ThreadLocal Variable: " + threadLocal.get() );
}
public static void main(String args[])
{
Runnable runner = new Runnable()
{
public void run()
{
// 给ThreadLocal变量设值并显示
threadLocal.set(new Integer(random.nextInt(10000)));
displayValues();
//线程内等一段时间后再显示该变量,以确认变量仍然有效
try
{
Thread.sleep(((Integer) threadLocal.get()).intValue());
displayValues();
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
};
// 生成多个线程
for (int i = 0; i < 5; i++)
{
Thread t = new Thread(runner);
t.start();
}
}
}
执行结果:
Thread Name:Thread-0, the ThreadLocal Variable: 1705
Thread Name:Thread-1, the ThreadLocal Variable: 8626
Thread Name:Thread-2, the ThreadLocal Variable: 4632
Thread Name:Thread-3, the ThreadLocal Variable: 802
Thread Name:Thread-4, the ThreadLocal Variable: 1072
Thread Name:Thread-3, the ThreadLocal Variable: 802
Thread Name:Thread-4, the ThreadLocal Variable: 1072
Thread Name:Thread-0, the ThreadLocal Variable: 1705
Thread Name:Thread-2, the ThreadLocal Variable: 4632
Thread Name:Thread-1, the ThreadLocal Variable: 8626