0

这是我正在使用线程制作的一个小程序的片段。

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

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

我相信这就是导致我得到的 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*/);
} 
4

2 回答 2

2

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

公共最终布尔值 isAlive()

测试此线程是否存在。如果线程已启动但尚未启动,则该线程是活动的
还是死了。

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

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

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

于 2012-11-25T10:26:43.773 回答
0

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

于 2012-11-25T10:18:41.957 回答