首页 > 解决方案 > 从另一个线程中检索字符串,导致周期性崩溃

问题描述

在我的应用程序中,我有一个线程正在从文件中读取数据。该线程还同时使用“正在读取 204 的对象 1”、“正在加载背景图像”等文本更新“状态”字符串。

在主应用程序线程中,会显示一个文本标签,并且每个帧都会从加载线程中检索此状态字符串并将其显示给用户,以便他们知道进度。

认为问题是线程,不知何故,因为(很少)在文本标签中发生崩溃,而它在渲染之前设置其文本。我觉得它得到了两个不同的文本值,并且数组索引超出了界限 - 关键是它正在崩溃。

加载线程:

// ...loading some stuff
setSavingOpeningStatusText("loading stuff 1");
// ...loading different stuff
setSavingOpeningStatusText("loading stuff 2");
// ...etc
setSavingOpeningStatusText("loading stuff 3);

主应用程序线程,在渲染之前的每个 update() 上:

statusLabel.setText(loadingThread.getSavingOpeningStatusText());

这是加载线程中的两个 get/set 函数:

public synchronized String getSavingOpeningStatusText()
{
    return savingLoadingStatusString;
}

private synchronized void setSavingOpeningStatusText(String text)
{
    savingLoadingStatusString = text;
}

我认为同步函数作为设置/获取此字符串值的唯一方法可以解决问题,但事实并非如此。

我在上面做错了什么,还是我在错误的地方寻找这个崩溃?


编辑,实际崩溃:

因此,每帧都会在 Label 上调用它:

statusLabel.setText(loadingThread.getSavingOpeningStatusText());

之后,当绘制发生时:

Fatal Exception: java.lang.IllegalStateException
Array is empty.
com.badlogic.gdx.utils.Array.pop (Array.java:323)
com.badlogic.gdx.utils.Pool.obtain (Pool.java:51)
com.badlogic.gdx.graphics.g2d.GlyphLayout.setText (GlyphLayout.java:143)
com.badlogic.gdx.scenes.scene2d.ui.Label.layout (Label.java:214)
...(bunch of stuff)
*.*.*.App.render (App.java:595)

绘制框架时,layout()在 Label 上调用它来计算大小等等,因为它已经分配了新的文本。这是整个应用程序中无数标签中唯一一个像这样崩溃的标签。再一次,非常罕见,这让我认为它的线程相关,即使它的一些池崩溃了(我认为它试图从池中获取一定数量的字形,但是这个数字在中途发生了变化,因为字符串正在改变跨线程?)。

标签: javamultithreadingthread-safety

解决方案


推荐阅读