有人可以告诉我为什么当我使用ScheduledExecutorService启动一个线程时threadlocal.get()给我null?
public class ThreadTest extends ParentClassThread
{
private static ScheduledFuture<?> periodicFuture;
private static ScheduledExecutorService ex;
public ThreadTest(){
ex = Executors.newSingleThreadScheduledExecutor();
periodicFuture = ex.schedule(this, 1, TimeUnit.SECONDS);
}
@Override
public void run() {
try {
System.out.println("Thread started");
for (int i = 0; i <= 100000; i++) {
System.out.println(i);
}
ThreadLocal local = new ThreadLocal();
System.out.println(local.get());
}catch(Exception e){
}finally {
ex.shutdown();
}
}
}
答案 0 :(得分:2)
ThreadLocal<String> local = new ThreadLocal<String>();
local.set("String");
System.out.println(local.get());
您需要在ThreadLocalVariable中设置一些内容然后检索它。最初,ThreadLocal为空。
答案 1 :(得分:1)
因为指定的ThreadLocal变量为空。 您需要设置值或指定初始值。
ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "initial value");
或
ThreadLocal<String> threadLocal = new ThreadLocal<>(); // now holding null
threadLocal.set("value"); //now holding "value"
如果未设置值,则ThreadLocal默认为null。
答案 2 :(得分:1)
您应该在方法运行之外初始化线程局部。您只需将其初始化一次,然后在线程内使用.set()和.get()。不要使用本地线程的多个实例。