当前位置: 首页 > 知识库问答 >
问题:

由于并发,Java代码在几秒钟后退出

桂玉石
2023-03-14

我在教程上写同样的代码。但在教程中,程序永远不会退出,在我的计算机中,它会在4秒钟后退出。为什么?教程中给出了显示此代码的确切时间:https://youtu.be/vzBw1LPupnA?t=169

public class Main {
    private static boolean stopRequested;

    public static void main(String[] args) throws InterruptedException {
        Thread backgroundThread = new Thread(() -> {
            int i = 0;
            while (!stopRequested) {
                i++;
                System.out.println("i = " + i);
            }
        });
        backgroundThread.start();
        TimeUnit.SECONDS.sleep(1);
        stopRequested = true;
    }
}

共有1个答案

何华灿
2023-03-14

您在计算机和视频中看到不同行为的原因是程序有未指定的行为。

您有两个线程访问和更新共享变量,而不采取必要的步骤来保证一个线程所做的更改对另一个线程可见。在这种情况下会发生什么并没有具体说明。在某些情况下(例如在某些平台上),可以立即或在短时间内看到更改。在其他人身上,它可能永远都看不见。

从技术角度讲,线程上的write by和另一个线程随后的read之间必须存在一个before关系。这可以通过两个线程在同一个互斥锁或锁上同步、使用volatile变量以及其他方式来实现。但这段代码不做这些事情。

有关更多详细信息,请阅读Java内存模型。

以上足以说明区别,但可能还有更直接的解释。

实际上,类似于系统的东西。出来println会导致可见性的改变。在封面下,println调用通常会导致输出流的缓冲区同步。这可能会导致意外发生在足以保证可见性之前。但是这种行为没有具体说明,所以你不应该依赖它。

无论如何,添加跟踪语句可以改变多线程编码的行为。事实上,你(显然)在你的版本中添加了它们,这是这种差异的第二种可能的解释。

这里的底线是,具有内存可见性缺陷的程序已损坏,但您可能无法证明它已损坏。

 类似资料:
  • 问题内容: 无论如何,我可以在几秒钟(例如5秒)后退出Java程序。 我知道您可以使用以下方法退出Java程序: 但是我不确定0是否代表以下代码: 也立即退出 问题答案: System.exit(0)指定程序的退出错误代码。 您可以将其放在计时器上并安排任务 然后就可以调用TimedExit()

  • 问题内容: 我想知道,几秒钟后如何在jquery中隐藏div?例如Gmail的邮件。 我已经尽力了,但是无法正常工作。 问题答案: 这将在1秒(1000毫秒)后隐藏div。 如果您只想隐藏而不褪色,请使用。

  • null -启动 ./common/plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar --Launcher.Library C:\Program Files\java\jre1.8.0_71\bin\javaw.exe -配置 H:\mye\myeclipse 10\配置 -vmargs -XMX512M

  • 我已经在上安装了Sonar,所有先决条件都是Mysql和Java。在控制台模式下启动服务时,将出现以下错误消息: 甚至,wrapper.properties文件中也配置了Java环境变量,但问题仍然存在。 来人,帮我解决这个问题。 在下面的wrapper.java.command(wrapper.properties)中设置Java路径后,将出现错误。 正在运行索纳库贝...包装器-->包装器作为

  • 我有一些链接,当我悬停在上面时,会显示与该链接相关的特定文本。我已经使用悬停功能来显示和隐藏div。 我还想添加这样的特性,即文本在几秒钟后自动改变,以显示下一个div的内容。即is循环通过DIVS。Hide div 1,show div 2,Hide 2,show div 3等。下面是显示悬停功能如何工作的代码。将鼠标悬停在右侧的链接上,左侧的文本将发生变化: null null

  • 这段简单的代码在几秒钟(大约 5 秒)后崩溃(窗口没有响应)。 如果我取消注释注释的行,我可以清楚地看到程序在显示 47 到 50 之间的值时失控。 我使用 python 2.7 和 pygame 1.9.2、Windows 8(64 位)和 Eclipse PyDev。