通过运行线程在main方法中更改变量x的值

时间:2011-02-12 23:08:08

标签: java multithreading

public static void main(String args[]) throws Exception {
    int maxScore = 0;

Thread student = new Thread(client,????);
student.start();
}

我希望学生线程改变maxScore的值,我该如何用Java做? (就像在C中我们可以传递maxScore的地址)

4 个答案:

答案 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]);
    }
}