如何在java中的run()之外为String赋值。它正在启动新线程,运行并获取值,然后应该返回它。如果我尝试在线程中设置string = value,它告诉我需要将String更改为final,然后
对此有何建议?
答案 0 :(得分:1)
“它告诉我我需要将String更改为最终无法正常工作”
似乎暗示我的问题不是线程问题,而是与封闭范围内的变量相关的(匿名)内部类访问。
我打赌你在做什么就是这样:
class Foo {
public void foo() {
String myString = "abc";
Thread t = new Thread(
new Runnable() {
@Override
public void run() {
myString = "xyz";
}
}
};
t.start();
t.join();
System.out.println("result :" + myString);
}
}
你会发现编译器抱怨“myString应该是最终的”类似的东西。它与多线程无关。简单来说,对于匿名内部类,它只能访问封闭范围内的最终变量。
鉴于String是不可变的,通过保持原始代码结构来解决的方法之一是拥有一些最终的String持有者。字符串数组是一种可能的选择,或者您可以使持有者像这样简单:
public class StringHolder {
String value;
public StringHolder(String value) {
this.value = value;
}
public void setValue(String value) {
this.value = value;
}
public value getValue() {
return this.value;
}
}
并将您的代码更改为以下内容:
class Foo {
public void foo() {
String myString = "abc";
final StringHolder myStringHolder = new StringHolder(myString);
Thread t = new Thread(
new Runnable() {
@Override
public void run() {
myStringHolder.setValue("xyz");
}
}
};
t.start();
t.join();
System.out.println("result: " + myStringHolder.getValue());
}
}
但是,这不是从线程获取结果的推荐方法。
我强烈建议您更改代码结构,并研究Future(及相关类)的使用。
答案 1 :(得分:0)
正如Ron Dahlgren评论的那样,正确的方法是使用Callable。执行此操作的方法是将字符串分配给final String[] oneStringReference = new String[1];
public class MyCallable implements Callable {
private Object param1;
private Object param2;
private Object param3;
public MyCallable(Object param1, Object param2, Object param3) {
this.param1 = param1;
this.param2 = param2;
this.param3 = param3;
}
public Object Callable() {
...
}
}