这是一个为了研究多线程而编写的小程序。我期望在运行后在主方法中获得不同的随机数。每秒大约 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;
关于java - 多线程不起作用。什么是不正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25560732/