【问题标题】:IllegalThreadStateException: Thread already started on a new ThreadIllegalThreadStateException:线程已在新线程上启动
【发布时间】:2016-04-22 02:15:24
【问题描述】:

我在 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();
}

怎么会这样?这是一个新线程?

梅丁羽衣甘蓝

【问题讨论】:

    标签: java android multithreading crash


    【解决方案1】:

    这可能发生在竞争条件的情况下。在这两条语句之间(给mThread赋值和调用start()方法),执行可以切换到另一个线程,可以再次进入refresh()方法,给mThread赋值不同的线程,然后启动它。当第一个线程恢复执行时,mThread 将包含另一个线程(已启动),并且 start() 方法将失败,并出现您描述的异常。

    解决此问题的一种方法是将new Thread() 的结果存储在局部变量中,然后对该变量调用 start() 方法,然后将其保存到字段中。 (这可能不是最合适的解决方法,但如果不了解有关问题发生的上下文的更多详细信息,就不可能说得更多。)

    【讨论】:

    • +10 按钮在哪里?
    【解决方案2】:

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

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

    Thread.State.NEW:线程已创建,但从未启动。

    【讨论】:

      猜你喜欢
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多