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

IllegalThreadStateException: Thread already started on a new Thread

我在 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() 方法,然后将其保存到字段中。 (这可能不是最合适的修复方法,但如果不了解有关问题发生的上下文的更多详细信息,就不可能说得更多。)

可能您的 mThread 已经启动并且 运行,这就是您得到该异常的原因。 尝试检查 mThread 的状态,只有在处于 Thread.State.NEW 状态时才启动它。

if (mThread.getState() == Thread.State.NEW)
{
     mThread.start();
}

Thread.State.NEW: The thread has been created, but has never been started.