这是一个旨在研究多线程的小程序。我希望在运行后能在主方法中得到不同的随机数。每秒大约4个数字。但我得到了成千上万的零。哪里有错误?
主要类别:
public class Main {
public static void main(String[] args) {
ExternalWorld externalWorld = new ExternalWorld();
externalWorld.start();
int x = 0;
while (true) {
while(!externalWorld.signal){
System.out.println("qqq");}
System.out.println(++x + ") " + externalWorld.getAnInt());
}
}
}
外部世界级:
import java.util.Random;
public class ExternalWorld extends Thread {
private int anInt = 0;
public boolean signal = false;
@Override
public void run() {
Random random = new Random(100);
while(true) {
anInt = random.nextInt(100);
signal = true;
try {
Thread.sleep(200);
signal = false;
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public int getAnInt() {
if (!signal) {
int p = 1 / 0;
}
int result = anInt;
anInt = 0;
return result;
}
}
问题:
private int anInt = 0;
public boolean signal = false;
从一个线程到另一个线程访问这些变量,从而在主线程上提供0
和false
解决方案:
使用volatile
关键字从多个线程访问这些变量
样本:
private volatile int anInt = 0;
public volatile boolean signal = false;