我有两个问题:
1.为什么我在运行程序时未调用run()
2.如果调用run(),是否会更改randomScore的值?
import java.*;
public class StudentThread extends Thread {
int ID;
public static volatile int randomScore; //will it change the value of randomScore defined here?
StudentThread(int i) {
ID = i;
}
public void run() {
randomScore = (int)( Math.random()*1000);
}
public static void main(String args[]) throws Exception {
for (int i = 1;i< 10 ;i++)
{
StudentThread student = new StudentThread(5);
student.start();
System.out.println(randomScore);
}
}
}
最佳答案
最重要的是,您需要进行更改
randomScore = (int) Math.random() * 1000;
到
randomScore = (int) (Math.random() * 1000);
^ ^
因为
(int) Math.random()
总是等于0。需要注意的另一重要事项是主线程继续并打印
randomScore
的值,而无需等待其他线程修改该值。尝试在Thread.sleep(100);
或start
之后添加student.join()
,以等待学生线程完成。您还应该意识到Java内存模型允许线程为变量缓存其值的事实。可能是主线程已经缓存了它自己的值。
尝试使randomScore易失:
public static volatile int randomScore;