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

标签 java multithreading

这是一个为了研究多线程而编写的小程序。我期望在运行后在主方法中获得不同的随机数。每秒大约 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;

关于java - 多线程不起作用。什么是不正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25560732/

相关文章:

java - java中的组和模式匹配

Java - 在 ConcurrentSkipListMap 上同步线程是否可以接受?

c++ - 如何使 Win32/MFC 线程同步循环?

java - Android服务在强制停止后继续运行

Java线程run()时调用其他方法{while(true){这里执行}}

java - 平衡二叉搜索树

java - 输入流和输出流之间的搜索/替换

multithreading - python (2.7) 中的守护线程是如何被杀死的

java - 几个 Java 泛型问题

java - Xtext - 内容提案匹配上下文缩进