Java线程错误IllegalThreadState线程已经启动

时间:2011-04-11 22:28:29

标签: java android

每当我开始我的线程时,我总是会做这个检查。我没有找到我在线程上调用start的任何地方,而没有进行下面的检查

if (!myThread.isAlive())
    myThread.start();

然而,我最终得到了IllegalThreadStateException:Thread已经启动了。这实际上崩溃了我的应用程序(android)。那么在启动线程之前还需要做一些其他的检查吗?

3 个答案:

答案 0 :(得分:11)

您应该检查线程是否已经开始使用getState()并仅在其state is NEW时启动,否则创建新线程(如果需要)。

答案 1 :(得分:3)

您是否使用new为myThread参考创建了一个新实例? 您只能在单个实例上执行一次myThread.start()。

检查它是否存活不是正确的方法。创建一个新实例。

答案 2 :(得分:0)

我刚才有一个类似的案例,这就是为什么我给出一个迟到的答案。

问题是,Thread.isAlive()Thread.start()的解决方案不是多线程安全的。它可能发生在第一个线程调用您的代码,执行isAlive()Thread.start()内的某个地方,在新线程启动之后和状态更改之前,发生任务切换并且第二个调用者执行{{1当它仍为isAlive()时,会使false被调用两次。为了使start()内的某处变得更糟,似乎强制执行任务切换,因此这个问题经常出现。

解决方案:覆盖start()以使其成为多线程安全的,例如

start()

然后,即使private final AtomicBoolean started = new AtomicBoolean(false); /* (non-Javadoc) * @see java.lang.Thread#start() */ @Override public synchronized void start() { if (!started.getAndSet(true)) { super.start(); } } 意外被调用两次,您的问题也不会再出现了。