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