Java 将ThreadLocal类传递给另一个线程?

Java 将ThreadLocal类传递给另一个线程?,java,multithreading,Java,Multithreading,我在Java程序中使用ThreadLocal,以便通过线程获取和设置某些数据成员 我有一节课,内容如下 public class ThreadLocalManager { public static final ThreadLocal<String> accountUsername = new ThreadLocal<String>(); public static final ThreadLocal<String> accountPasswo

我在Java程序中使用ThreadLocal,以便通过线程获取和设置某些数据成员

我有一节课,内容如下

public class ThreadLocalManager {
    public static final ThreadLocal<String> accountUsername = new ThreadLocal<String>();
    public static final ThreadLocal<String> accountPassword = new ThreadLocal<String>();
    public static final ThreadLocal<Long> accountId = new ThreadLocal<Long>();
    .....................
    .....................
    .....................

}
公共类ThreadLocalManager{
public static final ThreadLocal accountUsername=new ThreadLocal();
public static final ThreadLocal accountPassword=new ThreadLocal();
public static final ThreadLocal accountId=new ThreadLocal();
.....................
.....................
.....................
}

在我的多线程应用程序中,我一直在使用它,没有任何问题。现在每个线程将创建另一个线程,我希望将ThreadLocalManager传递给创建的新线程。如何做到这一点

编辑:我修改了我最初建议(如下)中的示例代码,使用
InheritableThreadLocal
,我发现添加更新的代码更简单

以下是更新的ThreadLocalManager:

package inheritableThreadLocal;

public class ThreadLocalManager {
    public static final InheritableThreadLocal<String> accountUsername = new InheritableThreadLocal<String>();
    public static final InheritableThreadLocal<String> accountPassword = new InheritableThreadLocal<String>();
    public static final InheritableThreadLocal<Long> accountId = new InheritableThreadLocal<Long>();
}
最后,包含main方法的更新类:

package inheritableThreadLocal;

public class ThreadLocalMain {

    public static void main(String[] args) {
        System.out.println("At start of main");
        System.out.println(ThreadLocalManager.accountId.get());
        System.out.println(ThreadLocalManager.accountUsername.get());
        System.out.println(ThreadLocalManager.accountPassword.get());

        Thread t1 = new Thread(new Runnable(){

            @Override
            public void run() {
                ThreadLocalManager.accountId.set(new Long(12345));
                ThreadLocalManager.accountUsername.set("user1");
                ThreadLocalManager.accountPassword.set("pass1");

                System.out.println("In t1 run");
                System.out.println(ThreadLocalManager.accountId.get());
                System.out.println(ThreadLocalManager.accountUsername.get());
                System.out.println(ThreadLocalManager.accountPassword.get());

                Thread t2 = new Thread(new Runner());
                t2.start();
            }

        });
        t1.start();
    }

}
原始建议:

因此,您可以使用
Runnable
对象创建新的
Thread
对象。如果这样做,您可以创建实现
Runnable
的自定义对象,并可以保存
ThreadLocal
变量的值,直到新的
Thread
启动。一旦新的
线程启动(即调用
run
方法),这些自定义
Runnable
对象将设置
ThreadLocal
变量

下面是一个类,我为此创建了一个main:

package threadLocal;

public class ThreadLocalMain {

    public static void main(String[] args) {
        System.out.println("At start of main");
        System.out.println(ThreadLocalManager.accountId.get());
        System.out.println(ThreadLocalManager.accountUsername.get());
        System.out.println(ThreadLocalManager.accountPassword.get());

        Thread t1 = new Thread(new Runnable(){

            @Override
            public void run() {
                ThreadLocalManager.accountId.set(new Long(12345));
                ThreadLocalManager.accountUsername.set("user1");
                ThreadLocalManager.accountPassword.set("pass1");

                System.out.println("In t1 run");
                System.out.println(ThreadLocalManager.accountId.get());
                System.out.println(ThreadLocalManager.accountUsername.get());
                System.out.println(ThreadLocalManager.accountPassword.get());

                Thread t2 = new Thread(new Runner(ThreadLocalManager.accountUsername.get(),
                        ThreadLocalManager.accountPassword.get(),
                        ThreadLocalManager.accountId.get()));
                t2.start();
            }

        });
        t1.start();
    }

}
为了完整起见,我使用了ThreadLocalManager:

package threadLocal;

public class ThreadLocalManager {
    public static final ThreadLocal<String> accountUsername = new ThreadLocal<String>();
    public static final ThreadLocal<String> accountPassword = new ThreadLocal<String>();
    public static final ThreadLocal<Long> accountId = new ThreadLocal<Long>();
}
此代码将
ThreadLocal
变量的值传递到
Runner
实例中,然后使用
Runner
实例创建一个新的
Thread
(您将看到,如果运行此代码,首先没有
ThreadLocal
变量的值)。然后,
Runner
设置
ThreadLocal
变量,您可以从控制台输出中看到,这些变量与t1的匹配


希望这有帮助

ThreadLocal
传递给另一个线程没有意义。您需要传递实际值。也许您需要InheritableThreadLocal@太酷了,这是我第一次碰到它!
package threadLocal;

public class ThreadLocalManager {
    public static final ThreadLocal<String> accountUsername = new ThreadLocal<String>();
    public static final ThreadLocal<String> accountPassword = new ThreadLocal<String>();
    public static final ThreadLocal<Long> accountId = new ThreadLocal<Long>();
}
package threadLocal;

public class Runner implements Runnable{

    private String userName, password;
    private long acctId;

    public Runner(String user, String pword, long accountId){
        System.out.println("In Runner constructor");
        System.out.println(ThreadLocalManager.accountId.get());
        System.out.println(ThreadLocalManager.accountUsername.get());
        System.out.println(ThreadLocalManager.accountPassword.get());

        userName = user;
        password = pword;
        acctId = accountId;
    }

    @Override
    public void run() {
        System.out.println("Inside Runner's run");
        System.out.println(ThreadLocalManager.accountId.get());
        System.out.println(ThreadLocalManager.accountUsername.get());
        System.out.println(ThreadLocalManager.accountPassword.get());

        ThreadLocalManager.accountId.set(acctId);
        ThreadLocalManager.accountUsername.set(userName);
        ThreadLocalManager.accountPassword.set(password);

        System.out.println("Inside Runner's run - after setting");
        System.out.println(ThreadLocalManager.accountId.get());
        System.out.println(ThreadLocalManager.accountUsername.get());
        System.out.println(ThreadLocalManager.accountPassword.get());
    }

}