每当我开始我的线程时,我总是会做这个检查。我没有找到我在线程上调用start的任何地方,而没有进行下面的检查
if (!myThread.isAlive())
myThread.start();
然而,我最终得到了IllegalThreadStateException:Thread已经启动了。这实际上崩溃了我的应用程序(android)。那么在启动线程之前还需要做一些其他的检查吗?
答案 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();
}
}
意外被调用两次,您的问题也不会再出现了。