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());

このコードは、ボタンを使用してアクティブ化されます。最初にボタンを押すと、「前: false」と「後: 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*/);
} 
4

2 に答える 2

2

スレッドの実行が完了すると、そのスレッドは停止していると見なされます。isAliveこの時点で同じスレッドを呼び出すと、常に の結果が返されfalseます。ThreadのJavaDoc には、次のように記載されています。

public final boolean 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 に答える