我有两个问题:
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;

09-25 20:49