ThreadLocal用于保存某个线程共享变量(名字相同的变量):对于同一个static ThreadLocal,不同线程只需要调用ThreadLocal自己的get,set,remove就可以得到自己的变量,在该线程中改变了值影响其他线程的变量,一个threadlocal只能存一个对象
1、ThreadLocal.get: 获取ThreadLocal中当前线程共享变量的值。
2、ThreadLocal.set: 设置ThreadLocal中当前线程共享变量的值。
3、ThreadLocal.remove: 移除ThreadLocal中当前线程共享变量的值。
4、ThreadLocal.initialValue: ThreadLocal没有被当前线程赋值时或当前线程刚调用remove方法后调用get方法,返回此方法值。
代码:
package threadpool;
public class MyThreadLocal {
private static final ThreadLocal<Object> threadLocal = new ThreadLocal<Object>(){
/**
* ThreadLocal没有被当前线程赋值时或当前线程刚调用remove方法后调用get方法,返回此方法值
*/
@Override
protected Object initialValue()
{
System.out.println("调用get方法时,当前线程共享变量没有设置,调用initialValue获取默认值!"+
"线程的名字:"+Thread.currentThread().getName());
return null;
}
};
public static void main(String[] args)
{
new Thread(new MyIntegerTask("IntegerTask1")).start();
// new Thread(new MyStringTask("StringTask1")).start();
new Thread(new MyIntegerTask("IntegerTask2")).start();
// new Thread(new MyStringTask("StringTask2")).start();
}
public static class MyIntegerTask implements Runnable
{
private String name;
MyIntegerTask(String name)
{
this.name = name;
}
@Override
public void run()
{
for(int i = 0; i < 5; i++)
{
// ThreadLocal.get方法获取线程变量
if(null == MyThreadLocal.threadLocal.get())
{
// ThreadLocal.et方法设置线程变量
MyThreadLocal.threadLocal.set(0);
System.out.println("线程null==Integer==" + name + ": 0");
}
else
{
int num = (Integer)MyThreadLocal.threadLocal.get();
MyThreadLocal.threadLocal.set(num + 1);
System.out.println("线程" + name + ": " + MyThreadLocal.threadLocal.get());
if(i == 3)
{
MyThreadLocal.threadLocal.remove();
}
}
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
public static class MyStringTask implements Runnable
{
private String name;
MyStringTask(String name)
{
this.name = name;
}
@Override
public void run()
{
for(int i = 0; i < 5; i++)
{
//该线程的threadLocal
if(null == MyThreadLocal.threadLocal.get())
{
MyThreadLocal.threadLocal.set("a");
System.out.println("线程null==String==" + name + ": a");
}
else
{
String str = (String)MyThreadLocal.threadLocal.get();
MyThreadLocal.threadLocal.set(str + "a");
System.out.println("线程" + name + ": " + MyThreadLocal.threadLocal.get());
}
try
{
Thread.sleep(800);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
得到结果
调用get方法时,当前线程共享变量没有设置,调用initialValue获取默认值!线程的名字:Thread-0
调用get方法时,当前线程共享变量没有设置,调用initialValue获取默认值!线程的名字:Thread-1
线程null==Integer==IntegerTask1: 0
线程null==Integer==IntegerTask2: 0
线程IntegerTask2: 1
线程IntegerTask1: 1
线程IntegerTask1: 2
线程IntegerTask2: 2
线程IntegerTask1: 3
线程IntegerTask2: 3
调用get方法时,当前线程共享变量没有设置,调用initialValue获取默认值!线程的名字:Thread-0
线程null==Integer==IntegerTask1: 0
调用get方法时,当前线程共享变量没有设置,调用initialValue获取默认值!线程的名字:Thread-1
线程null==Integer==IntegerTask2: 0
每个线程都有一个ThreadLocalMap,key值就是ThreadLocal,值就是我们给它的值
参考:https://www.cnblogs.com/coshaho/p/5127135.html