Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我怎么能不使用参数在不同类的方法之间传递值呢_Java_Thread Local - Fatal编程技术网

Java 我怎么能不使用参数在不同类的方法之间传递值呢

Java 我怎么能不使用参数在不同类的方法之间传递值呢,java,thread-local,Java,Thread Local,通常,不同类之间的值传递是通过方法的参数完成的,例如,传递id值,如下所示: public class Controller { private Service service = new Service(); void controllerMethod() { Integer id = 5; service.serviceMethod(id); } public static void main(String[] args) {

通常,不同类之间的值传递是通过方法的参数完成的,例如,传递id值,如下所示:

public class Controller {
    private Service service = new Service();
    void controllerMethod() {
        Integer id = 5;
        service.serviceMethod(id);
    }
    public static void main(String[] args) {
        Controller c = new Controller();
        c.controllerMethod();
    }
}

public class Service {
    private Dao dao = new Dao();
    void serviceMethod(Integer id) {
        dao.daoMethod(id);
    }
}

public class Dao {
    void daoMethod(Integer id) {
        System.out.println(id);
    }
}
这些方法调用实际上在一个线程中,所有的方法调用都在“主”线程中。所以我想知道我是否可以将这个值存储在ThreadLocal的类“Controller”中,然后从类“Dao”的ThreadLocal中获取它,但我失败了

public class Controller {
    private Service service = new Service();

    void controllerMethod() {
        Integer id = 5;
        System.out.println(Thread.currentThread().getName());
        // ----add code
        ThreadLocal<Integer> local = new ThreadLocal<>();
        local.set(id);
        // ----
        service.serviceMethod();
    }

    public static void main(String[] args) {
        Controller c = new Controller();
        c.controllerMethod();
    }
}

public class Service {
    private Dao dao = new Dao();

    void serviceMethod() {
        System.out.println(Thread.currentThread().getName());
        dao.daoMethod();
    }
}

public class Dao {
    void daoMethod() {
        System.out.println(Thread.currentThread().getName());
        // ----add code
        ThreadLocal<Integer> local = new ThreadLocal<>();
        System.out.println(local.get());
        // ----
    }
}
公共类控制器{
私有服务=新服务();
void controllerMethod(){
整数id=5;
System.out.println(Thread.currentThread().getName());
//----添加代码
ThreadLocal local=新的ThreadLocal();
local.set(id);
// ----
service.serviceMethod();
}
公共静态void main(字符串[]args){
控制器c=新控制器();
c、 controllerMethod();
}
}
公务舱服务{
私有Dao=新Dao();
void serviceMethod(){
System.out.println(Thread.currentThread().getName());
dao.dao方法();
}
}
公共类Dao{
void方法(){
System.out.println(Thread.currentThread().getName());
//----添加代码
ThreadLocal local=新的ThreadLocal();
System.out.println(local.get());
// ----
}
}
结果:

我不知道为什么…这个方法可以在没有参数的情况下实现传递值吗?我希望有人能帮助我

附言: 有没有其他方法可以实现多个类之间的无参数值传递


ThreadLocal
通常用作静态变量:

public class Main {
    private static final ThreadLocal<Integer> CURRENT_ID = new ThreadLocal<>(1);

    private void method1() {
        CURRENT_ID.set(100);
        method2();
    }

    private void method2() {
        System.out.println("ID: " + CURRENT_ID.get());
    }
}
公共类主{
私有静态最终ThreadLocal CURRENT_ID=新ThreadLocal(1);
私有void方法1(){
当前_ID.set(100);
方法2();
}
私有void方法2(){
System.out.println(“ID:+CURRENT_ID.get());
}
}
但对于常规应用程序代码,您几乎不需要直接使用
ThreadLocal
。即使它使编写代码更容易,也要时刻记住测试!因此,在你的情况下,我会考虑把必要的变量作为参数传递下去。

如果您考虑通过线程本地传递像DAOS或服务这样的依赖关系,您应该考虑./P>


当方法的参数太多时,不要通过ThreadLocal传递一些参数,请查看。

您可以使用Java的系统类-由@Abhishek建议的解决方案

System.setProperty("id", Integer.toString(5));
现在,您可以使用getProperty(“id”)方法并在另一个类中读取id值

  System.getProperty("id");

ThreadLocal类为每个线程提供其自己的特定对象实例。它不是用来传递参数的,当您有一些对象不是线程安全的,但希望避免同步访问该对象时,可以使用它。
它取决于参数或变量的访问类型,如果它们在特定方法中是局部的,并且不是常量,并且返回值或方法体的代码取决于该变量,则将其作为该方法的输入参数,但是如果它在整个类上是全局的,那么将其作为类级变量,并使用getter和setter访问它,如果该类的所有实例之间共享该类级变量,那么根据您的设计,将其设置为静态的,场景和需求您也可以将其设置为最终版本,或在构造函数或静态代码块中初始化变量。

您可以这样做:

class Test {
    public static void main(String[] args) {
        System.setProperty("id", "5");
        getId();
    }
    public static void getId() {
        System.out.println(System.getProperty("id"));
    }
}
您可以设置属性,并可以从任何位置访问它。
这是最简单的方法。

线程本地用于确保您拥有运行它的线程所特有的对象。threadlocal中的Random意味着每个线程都使用自己的Random实例。您可以使用
公共静态变量,但不能使用。通过参数传递是好的。将其写入数据库并从数据库中读取,或者使用JMS。