我想知道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;
对于含糊不清感到抱歉。
答案 0 :(得分:3)
runner.start()
将在单独的线程中执行您的run方法,并立即继续下一行。然后会在您的班级中为runnerValue
分配value
,除非:
value
value
所以不能保证你可以看到这样的变化。答案 1 :(得分:2)
从纯程序的角度来看,代码没问题,你会得到一个值。
但从逻辑角度来看,代码很糟糕。在runner.start()之后立即调用runner.getValue()。假设运行器会做一些事情来计算一个值,并且getValue()在主线程中执行。因此,当getValue()在主线程中执行时,它不确定转子线程是什么,所以getValue()将返回一个你不想要的值。
答案 2 :(得分:2)
我建议尝试一下,但我认为以下情况会发生:
如果您需要等到某些业务逻辑完成,您应该使用2个线程之间的同步。第一个线程应该调用wait方法,第二个线程应该在完成时调用notify方法,因此通知第一个线程。