public static void main(String args[]) throws Exception {
int maxScore = 0;
Thread student = new Thread(client,????);
student.start();
}
我希望学生线程改变maxScore的值,我该如何用Java做? (就像在C中我们可以传递maxScore的地址)
答案 0 :(得分:7)
如果要在单独的线程中修改值,则需要一个类对象。例如:
public class Main {
private static class Score {
public int maxScore;
}
public static void main(String args[]) throws Exception {
final Score score = new Score();
score.maxScore = 1;
System.out.println("Initial maxScore: " + score.maxScore);
Thread student = new Thread() {
@Override
public void run() {
score.maxScore++;
}
};
student.start();
student.join(); // waiting for thread to finish
System.out.println("Result maxScore: " + score.maxScore);
}
}
答案 1 :(得分:5)
你做不到。您无法从另一个线程更改局部变量的值。
但是,您可以使用具有int
字段的可变类型,并将其传递给新线程。例如:
public class MutableInt {
private int value;
public void setValue(..) {..}
public int getValue() {..};
}
(Apache commons-lang提供了一个可以重用的MutableInt
类)
更新:对于全局变量,您可以简单地使用public static
字段。请注意,如果您不仅愿意在其中存储某些值,而且还要阅读它们并根据具体情况执行操作,则需要使用synchronized
块或AtomicInteger
,具体取决于用法。
答案 2 :(得分:0)
添加同步到方法对我来说是一个解决方案,谢谢
答案 3 :(得分:0)
此外,您可以使用(一个元素的)数组:
public class Main {
public static void main(String args[]) throws Exception {
final int[] score = new int[1];
score[0] = 1;
System.out.println("Initial maxScore: " + score[0]);
Thread student = new Thread() {
@Override
public void run() {
score[0]++;
}
};
student.start();
student.join(); // waiting for thread to finish
System.out.println("Result maxScore: " + score[0]);
}
}