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);
}
}