0

我想知道在 Java 中是否有可能做到这样的事情。

class Running extends Thread {

    private int value;

    public void run() {
        while (true) {
            do stuff;
        }
    }

    public int getValue() {
        return value;
    }
}

public static void main(String[] args){
    Running runner = new Running();
    runner.start();
    int runnerValue = runner.getValue(); // Will I ever get the value?
}

[编辑]

我也想知道这是否推荐?

[编辑2]

我知道如果在 run() 方法中更改该值可能会搞砸。我更感兴趣的案例其实是

private final int VALUE = 100;

对歧义感到抱歉。

4

3 回答 3

3

runner.start()将在单独的线程中执行您的 run 方法并立即继续下一行。runnerValue然后将value在您的班级中分配 0,除非:

  • 您的运行方法正在改变value
  • 并且它有时间去做(这不太可能,因为启动线程可能需要很长时间才能让这种情况发生)
  • 而且你很幸运,可以从主线程中看到这种变化——你没有使用任何形式的同步来读取value主线程,所以不能保证你能看到这样的变化。
于 2012-11-30T11:18:30.940 回答
2

从纯程序的角度来看,代码没问题,你会得到一个值。

但是从逻辑的角度来看,代码很糟糕。在 runner.start() 之后立即调用 runner.getValue()。假设 runner 会做一些事情来计算一个值,并且 getValue() 在主线程中执行。因此,当 getValue() 在主线程中执行时,不确定运行线程正在执行什么操作,因此 getValue() 会返回一个您不想要的值。

于 2012-11-30T11:23:28.900 回答
2

我建议尝试一下,但我认为会发生以下情况:

  1. 线程将被创建并开始运行。
  2. 主程序将获取该值,但线程仍将运行。

如果您需要等到某些业务逻辑完成,您应该在 2 个线程之间使用同步。第一个线程应该调用一个等待方法,第二个线程应该在完成后调用通知方法,所以通知第一个线程。

于 2012-11-30T11:24:27.433 回答