【问题标题】:Java Creating Instance of BufferedImage Freezes ProgramJava创建BufferedImage冻结程序实例
【发布时间】:2017-06-06 01:01:50
【问题描述】:

我遇到了一些非常奇怪的事情,我完全不知道是什么原因造成的。这是有问题的代码行:

BufferedImage out = new BufferedImage(256, 256, BufferedImage.TYPE_INT_RGB);

调用它时,所有线程都会冻结,一切都会停止。我试过把它放在它自己的线程和主线程中,同样的事情发生了。我正在使用 LWJGL3,所以这可能是个问题,但我不明白它是怎么回事。

编辑:在没有 LWJGL 进入或退出 -XstartOnFirstThread 的空白项目中不会发生

【问题讨论】:

  • 你怎么知道程序停止的地方?你有没有用调试器检查过每个线程的调用栈?
  • @Radiodef 我没有检查任何调用堆栈,但我有这段代码要调试:System.out.println("Before");BufferedImage out = new BufferedImage(256, 256, BufferedImage.TYPE_INT_RGB);System.out.println("After");我在控制台中只看到“之前”。
  • 嗯,接下来我要做的是使用调试器检查每个线程的调用堆栈,以验证它们确实已冻结以及它们都在哪里。
  • @Radiodef 似乎ColorModel.loadLibraries 是线程刚刚停止的地方。在该方法内部,java.security.AccessController.doPrivileged 被调用。编辑:我什至尝试创建另一个线程以反复将内存使用情况打印到控制台中,但即使该线程也锁定了。
  • 在一个简单的 main 方法中实例化 BufferedImage,无需添加 lwjgl 和其他库来构建路径。它自己工作吗?

标签: java multithreading lwjgl bufferedimage freeze


【解决方案1】:

好的!我找到了解决方案。事实证明,只需要以下 JVM 参数:-Djava.awt.headless=true 您还必须确保不是在主线程中运行它,而是在初始化 GLFW 的线程之外执行。

所有这些仅适用于您在 Mac、Linux 和 Windows 上运行 LWJGL 时没有此问题。

【讨论】:

    猜你喜欢
    • 2013-08-19
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2017-12-18
    相关资源
    最近更新 更多