在下面的代码中,我将临时threadlocal值存储在threadlocal类中,并将该值设置为另一个类。

List<String> spaces=new ArrayList<String>();
spaces.add(spaceKey);
ThreadLocal<List<String>> threadLocal=new ThreadLocal<List<String>>();
threadLocal.set(spaces);
setShardHolder(threadLocal);

我在另一个类有 setter/getter 和二传手
private ThreadLocal<List<String>> shardHolder;
public ThreadLocal<List<String>> getShardHolder() {
return shardHolder;
}
public void setShardHolder(ThreadLocal<List<String>> shardHolder) {
this.shardHolder = shardHolder;
}

我无法使用 setter/getter 访问值

最佳答案

您似乎还不了解ThreadLocal变量的工作方式。 ThreadLocal实例有点像单个值的容器。如果将内容存储在其中,则它将与当前线程相关联,以后您可以从同一线程中检索它。

但是,当然,如果将某些内容存储在ThreadLocal实例中,并尝试从其他ThreadLocal实例中检索它,则始终会得到null:它们不是同一容器。

因此,ThreadLocal通常隐藏在静态方法的后面。例如,假设您要将用户与当前线程相关联。你会做

public class CurrentUser {
    private static final ThreadLocal<User> CURRENT = new ThreadLocal<User>();

    public static User getCurrentUser() {
        return CURRENT.get();
    }

    public static void setCurrentUser(User user) {
        CURRENT.set(user);
    }
}

然后让我们设计一个场景:
public class Test
    public static void main(String[] args) {
        CurrentUser.set(new User("foo"));
        System.out.println(CurrentUser.get()); // prints foo
        new Thread(new Runnable() {
            public void run() {
                System.out.println(CurrentUser.get()); // prints null: different thread
            }
        }).start();
    }
}

关于java - 我在一个类中设置threadlocal的值,我可以在另一个类中访问该值吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17615341/

10-12 02:07