ScheduledExecutorService 的 ThreadLocal
ThreadLocal for ScheduledExecutorService
有人可以告诉我为什么 threadlocal.get() 在我使用 ScheduledExecutorService 启动线程时给我 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();
}
}
}
因为指定的 ThreadLocal 变量为空。
您需要设置一个值或指定一个初始值。
ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "initial value");
或
ThreadLocal<String> threadLocal = new ThreadLocal<>(); // now holding null
threadLocal.set("value"); //now holding "value"
如果不设置值,ThreadLocal 默认为 null。
您应该在方法 运行 之外初始化本地线程。您只需初始化一次,然后从内部线程使用 .set() 和 .get() 。不要使用本地线程的多个实例。
ThreadLocal<String> local = new ThreadLocal<String>();
local.set("String");
System.out.println(local.get());
您需要在 ThreadLocalVariable 中设置一些内容,然后检索它。最初,ThreadLocal 是空的。
有人可以告诉我为什么 threadlocal.get() 在我使用 ScheduledExecutorService 启动线程时给我 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();
}
}
}
因为指定的 ThreadLocal 变量为空。 您需要设置一个值或指定一个初始值。
ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "initial value");
或
ThreadLocal<String> threadLocal = new ThreadLocal<>(); // now holding null
threadLocal.set("value"); //now holding "value"
如果不设置值,ThreadLocal 默认为 null。
您应该在方法 运行 之外初始化本地线程。您只需初始化一次,然后从内部线程使用 .set() 和 .get() 。不要使用本地线程的多个实例。
ThreadLocal<String> local = new ThreadLocal<String>();
local.set("String");
System.out.println(local.get());
您需要在 ThreadLocalVariable 中设置一些内容,然后检索它。最初,ThreadLocal 是空的。