从另一个线程检索字符串会导致定期崩溃

时间:2019-01-09 14:16:00

标签: java multithreading thread-safety

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

在主应用程序线程中,显示​​一个文本Label,它在每个框架中从加载线程中检索此状态String,并将其显示给用户,以便他们知道进度。

认为,问题出在某种程度上是线程化的,因为(很少)在渲染之前设置其文本时,文本Label发生崩溃。我感觉它正在获取两个不同的文本值,并且数组索引超出范围-就是崩溃了。

加载线程:

// ...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;
}

我认为,同步函数是设置/获取此String值的唯一方法,可以解决问题,但没有。

我在上面做错什么了吗,还是我在寻找错误的位置以找出这次崩溃?


编辑,实际崩溃:

因此,每隔一帧在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)

绘制框架时,在Label上调用layout(),该标签将计算大小,而由于已经分配了新的文本,所以不进行计算。这是整个应用程序中无数这样的唯一崩溃的标签。再次,这是非常罕见的,这就是让我认为它的线程相关的原因,即使它的某些Pool崩溃了(我认为它正试图从一个Pool中获取一定数量的字形,但是由于String在改变,这个数字在中途改变了。跨线程?)。

0 个答案:

没有答案