IllegalThreadStateException:线程已在新线程上启动

时间:2016-01-16 15:40:08

标签: java android multithreading crash

我在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

2 个答案:

答案 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 :线程已创建,但从未启动过。