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 是空的。