这是我使用线程创建的一个小程序的片段。
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*/);
}
答案 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)
您必须将线程变量存储为类成员并仅创建一次。最有可能的是,您将其存储为局部变量,并在每次按下按钮时创建它。