多线程不起作用。什么是不正确的?



这是一个旨在研究多线程的小程序。我希望在运行后能在主方法中得到不同的随机数。每秒大约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;

从一个线程到另一个线程访问这些变量,从而在主线程上提供0false

解决方案:

使用volatile关键字从多个线程访问这些变量

样本:

private volatile int anInt = 0;
public volatile boolean signal = false;

最新更新