我在Play商店发布了Android应用,并且crashreports显示致命异常:java.lang.IllegalThreadStateException:线程已经启动 在
public void refresh(){
if (Thread.currentThread() != mThread) {
mThread = new Thread() {
@Override
public void run() {
refresh();
}
};
mThread.start();//<<<<<<<<<<<<<here
return;
}
doSomeCoolStuff();
}
怎么会发生这种情况?这是一个新线程?
Metin Kale
答案 0 :(得分:3)
这种情况可能发生在竞争条件下。在两个语句之间(为mThread赋值并调用start()方法),执行可以切换到另一个线程,该线程可以再次进入refresh()方法,为mThread分配不同的线程,然后启动它。当第一个线程恢复执行时,mThread将包含一个不同的线程(已经启动),并且start()方法将失败,除非您描述。
解决此问题的一种方法是将new Thread()
的结果存储在局部变量中,然后对该变量调用start()方法,然后将其保存到字段中。 (这可能不是最合适的解决方案,但如果不了解有关问题发生的背景的更多详细信息,就无法说出更多内容。)
答案 1 :(得分:2)
可能你的mThread
已经启动并正在运行,这就是为什么你会得到那个例外。
尝试检查mThread
的状态,并仅在处于Thread.State.NEW
状态时启动。
if (mThread.getState() == Thread.State.NEW)
{
mThread.start();
}
Thread.State.NEW :线程已创建,但从未启动过。