Java线程在run(){while(true){execution here}}时调用其他方法

时间:2012-11-30 11:13:01

标签: java multithreading

我想知道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?
}

[编辑]

我还想知道是否推荐这个?

[EDIT2]

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

private final int VALUE = 100;

对于含糊不清感到抱歉。

3 个答案:

答案 0 :(得分:3)

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

  • 您的run方法正在更改value
  • 的值
  • AND 它有时间去做(这是非常不可能的,因为启动线程可能需要很长时间才能实现)
  • AND 你很幸运,可以看到主线程的变化 - 你没有使用任何形式的同步来读取主线程中的value所以不能保证你可以看到这样的变化。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

  1. 线程将被创建并开始运行。
  2. 主程序将获取值,但线程仍将运行。
  3. 如果您需要等到某些业务逻辑完成,您应该使用2个线程之间的同步。第一个线程应该调用wait方法,第二个线程应该在完成时调用notify方法,因此通知第一个线程。