我在Play商店中发布了一个Android应用,崩溃报告显示了致命异常:java.lang.IllegalThreadStateException:线程已启动
在
public void refresh(){
if (Thread.currentThread() != mThread) {
mThread = new Thread() {
@Override
public void run() {
refresh();
}
};
mThread.start();//<<<<<<<<<<<<<here
return;
}
doSomeCoolStuff();
}
怎么会这样这是一个新线程?
梅丁·羽衣甘蓝
最佳答案
在竞赛条件下可能会发生这种情况。在两个语句之间(将值分配给mThread并调用start()方法),执行可以切换到另一个线程,该线程可以再次进入refresh()方法,为mThread分配另一个线程,然后启动它。当第一个线程恢复执行时,mThread将包含一个不同的线程(已经启动),并且start()方法将失败,并带有您描述的异常。
解决此问题的一种方法是将new Thread()
的结果存储在本地变量中,然后在该变量上调用start()方法,然后将其保存到字段中。 (这可能不是最合适的解决方法,但是如果不知道问题发生的具体环境的更多细节,就不可能多说。)