Java ScheduledExecutorService的ThreadLocal
有人能告诉我为什么当我使用ScheduledExecutorService启动线程时,threadlocal.get()会给我null值吗Java ScheduledExecutorService的ThreadLocal,java,java.util.concurrent,Java,Java.util.concurrent,有人能告诉我为什么当我使用ScheduledExecutorService启动线程时,threadlocal.get()会给我null值吗 public class ThreadTest extends ParentClassThread { private static ScheduledFuture<?> periodicFuture; private static ScheduledExecutorService ex; public Threa
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();
}
}
}
公共类ThreadTest扩展了ParentClassThread
{
私有静态调度未来周期未来;
私有静态ScheduledExecutorService ex;
公共线程测试(){
ex=Executors.newSingleThreadScheduledExecutor();
periodicFuture=ex.schedule(这个,1,时间单位为秒);
}
@凌驾
公开募捐{
试一试{
System.out.println(“线程启动”);
对于(int i=0;i,因为指定的ThreadLocal变量为空。
您需要设置一个值或指定一个初始值
ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "initial value");
ThreadLocal-ThreadLocal=ThreadLocal.withInitial(()->“初始值”);
或
ThreadLocal ThreadLocal=new ThreadLocal();//现在为null
threadLocal.set(“value”);//现在持有“value”
如果未设置值,ThreadLocal将默认为null。您应该在方法运行之外初始化thread local。您只需初始化一次,然后从线程内部使用.set()和.get()。不要使用thread local的多个实例。ThreadLocal=new ThreadLocal();
ThreadLocal<String> local = new ThreadLocal<String>();
local.set("String");
System.out.println(local.get());
local.set(“字符串”);
System.out.println(local.get());
您需要在ThreadLocalVariable中设置一些内容,然后检索它。最初,ThreadLocal是空的。更新了问题…请不要使用get方法设置您试图访问的ThreadLocal。这不是您通常使用ThreadLocal的方式;您试图实现什么?这看起来像是XY问题我的错…我可以我不明白一件简单的事情…接受下面的答案…谢谢
ThreadLocal<String> local = new ThreadLocal<String>();
local.set("String");
System.out.println(local.get());