线程没有保持活着 - IllegalStateException

时间:2012-11-25 10:12:08

标签: java multithreading

这是我使用线程创建的一个小程序的片段。

JOptionPane.showMessageDialog(null, "Before: " + thread.isAlive());
if (!thread.isAlive()) {
    JOptionPane.showMessageDialog(null, "Thread is not alive.");
    thread.start();
}
JOptionPane.showMessageDialog(null, "After: " + thread.isAlive());

使用按钮激活此代码。当我第一次按下按钮时,我正确地得到“Before:false”然后“After:true”。 当我再次按下按钮时,我错误地得到“Before:false”然后“After:true”,但是期望Before:true,因为我没有破坏线程或覆盖变量。

我相信这是导致我得到的IllegalStateException的原因(如果我错了,请纠正我!)

任何人都可以向我解释我做错了吗?

编辑:

public class SomeClass extends Applet
{

private ClassThatExtendsThread thread;

public void init()
{
    super.init();

    //Some UI elements are created here.

    thread = new ClassThatExtendsThread (/*there are some parameters*/);
} 

2 个答案:

答案 0 :(得分:2)

一旦线程完成运行,它就被认为是死的。此时在同一个线程上调用isAlive将始终返回false的结果。 JavaDoc for Thread确实提到了这一点:

public final boolean isAlive()

Tests if this thread is alive. A thread is alive if it has been started and has not
yet died.

如果您没有在代码片段之间的中间重新实例化线程实例,那么您肯定会收到IllegalStateException。这是因为您尝试启动已终止的线程:

if (!thread.isAlive()) {
    JOptionPane.showMessageDialog(null, "Thread is not alive.");
    thread.start();
}

为了将来参考,请注意您可以通过getState方法查询线程状态,这有助于分析错误。

答案 1 :(得分:0)

您必须将线程变量存储为类成员并仅创建一次。最有可能的是,您将其存储为局部变量,并在每次按下按钮时创建它。