Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading - Fatal编程技术网

Java 将线程级局部变量从一个类传递到另一个类

Java 将线程级局部变量从一个类传递到另一个类,java,multithreading,Java,Multithreading,下面是场景 public class A{ private final B b; public A(){ this.b = new B(); this.c = new C(); } public void setValue(){ this.b.value("HELLO WORLD") this.c.print(); } } 将“Hello World”设置为文本 无法获取“Hello World”。它以“”的形式返回

下面是场景

public class A{
   private final B b;

   public A(){
     this.b = new B();
     this.c = new C();
   }

   public void setValue(){
      this.b.value("HELLO WORLD")
      this.c.print();
   }
}
将“Hello World”设置为文本

无法获取“Hello World”。它以“”的形式返回


任何帮助都将不胜感激。我需要一个解决方案将值传递给一个类到另一个类

我认为B的构造函数中的赋值导致了这个问题。由于您使文本具有易变性,因此每次创建B实例时,文本的值都会被“”覆盖,然后所有线程都会读取此更新的值。只需将文本变量设为静态,就可以在C类中得到“Hello World”。

我得到了答案,必须将B的引用从A发送到C

public class A{
   private final B b;
   private final C c;

   public A(){
     this.b = new B();
     this.c = new C (this.b);
   }

   public void setValue(){
      this.b.value("HELLO WORLD");
      this.c.print();
   }
}


public class B{
    public volatile String text;
    public B(){
        this.text = "";
    }
    public void value(String t){
        this.text = t;
    }
}


public class C{
    private final B b;
    public C(B b){
        this.b = b;
    }
    public void print(){
        System.out.println(this.b.text);
    }
}

类C从不调用B.value()。文本从未设置。实例是否作为单独的线程运行?如果是这样,A有它自己的B副本,C中使用的B是不同的。我想得到由类A设置的值。所有的都在同一个线程中运行。我没有看到类A的任何实例化。A.setValue在哪里调用?有几个问题。正如正确指出的,构造函数正在覆盖该值。问:你想让B.text在全班范围内吗?如果是,则声明它
静态字符串文本。问:或者您希望它是每个对象的(每个类实例都有自己的“text”值)。建议:在任何情况下,请将“text”设置为私有,并使用标准的getter/setters:
public void setText(String text)
public String getText()
。您创建了
B
的两个实例,但只在其中一个实例中设置字符串。
volatile
并不意味着他面临的问题与标记字段无关
volatile
我从来没有说过volatile字段是问题,我只是指出在B中赋值会更改volatile fiel的值所以他必须摆脱这个任务,以获得期望的价值。
public class C{
    private final B b;
    public B(){
        this.b = new B;
    }
    public void print(){
        System.out.println(this.b.text);
    }
}
public class A{
   private final B b;
   private final C c;

   public A(){
     this.b = new B();
     this.c = new C (this.b);
   }

   public void setValue(){
      this.b.value("HELLO WORLD");
      this.c.print();
   }
}


public class B{
    public volatile String text;
    public B(){
        this.text = "";
    }
    public void value(String t){
        this.text = t;
    }
}


public class C{
    private final B b;
    public C(B b){
        this.b = b;
    }
    public void print(){
        System.out.println(this.b.text);
    }
}