public class ThreadId {
static final ThreadLocal<String> t = new ThreadLocal<String>() {
@Override
protected String initialValue() {
return new String("threadlocal");
}
};
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
ExecutorService pool = Executors.newFixedThreadPool(5);
for(int i = 0; i<15;i++) {
Runnable runnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(ThreadId.t.get()+":"+Thread.currentThread().getName());
ThreadId.t.set("ss");
System.out.println(System.currentTimeMillis()+": doSomeThing");
ThreadId.t.remove();//####1
}
};
pool.execute(runnable);
}
pool.shutdown();
}
}
//####1 所在行注释掉和不注释的区别。ThreadLocal 是与执行execute()方法对应的Thread绑定的,如果使用线程池,在线程池中的线程的生命周期与所提交执行的任务的生命周期并不相同,
那么在任务中当第一次ThreadId.t.set()方法调用后,与该线程绑定,由于ThreadLocal是static修饰的,当改变后,相对应的线程key 的ThreadLocal value
值将会是修改后的数据,后面每次获得的值都将会是最新。如果只是想该任务结束后,不影响其他任务对ThreadLocal值的初始化改变,应当remove().