0

ボタン内にJavaでスレッドを作成して単純なメッセージを出力しますが、停止できません。

Thread a = new Thread();
a.start();

while(true){
    try{
        Thread.sleep(2000);
        System.out.println("code");
    }catch(Exception e){
    }
}

それをクリックすると、コードの印刷が開始されますが、ブロックされているようです (ボタン)。私が知りたいのですが。どうすればスレッドを停止できますか? そして、私がそれを止めたら、ボタンは再び利用可能になりますか?.

私はnetbeans 7.3を使用しています、ありがとう。

4

4 に答える 4

1
while(true){
}

他のすべての操作がブロックされるため、無限ループが開始されます。

それを削除します

于 2013-03-26T17:41:42.797 に答える
0

開始しているスレッドは何もしていません。a.start()このスレッドを実行するためのコードがないため、呼び出すとすぐに終了します。これに続いて、新しいスレッドを開始し、クリック イベントを処理している同じスレッドが無限ループに入り、ユーザー インターフェイスが完全にブロックされます。

新しいスレッドを実行するには、いくつかのコードを指定する必要があります。これを行うには、スレッド a を渡すか、スレッドのメソッドRunnableをオーバーライドします。run()たとえば、Runnable2 秒ごとに出力するループを含む を指定するには、次のようにします。

final Thread a = new Thread(new Runnable() {
  @Override public void run() {
    while (true) {
      try {
        Thread.sleep(2000);
        System.out.println("code");
      } catch (InterruptedException e) {
        break;
      }
    }
  }
};
a.start();

その後、そのスレッドを停止したい場合は、スレッドへの参照をaフィールドなどに保存してから、 を呼び出す必要がありますa.interrupt()。これによりsleepがスローInterruptedExceptionされ、キャッチされて が実行breakされ、無限ループが終了し、スレッドがrunメソッドの最後に到達してスレッドが終了します。

例えば:

private Thread a = null;
... click handler on start button ... {
  if (a == null) {
    a = new Thread(new Runnable() {
      @Override public void run() {
        while (true) {
          try {
            Thread.sleep(2000);
            System.out.println("code");
          } catch (InterruptedException e) {
            break;
          }
        }
      }
    };
    a.start();
  }
}

... click handler on "stop" button ... {
  if (a != null) {
    a.interrupt();
    a = null;
  }
}
于 2013-03-26T17:44:02.907 に答える
0

Java ではスレッドを停止するのではなく、interrupt()シグナルを送信します。

スレッドはシグナルをキャッチする場合とキャッチしない場合があります。、waitingまたは( 、sleep()sleepingまたはjoin()) が呼び出された場合)、 anが発生します。joiningwait()InterruptedException

スレッド (while ループ内) は、メソッドを呼び出すことによって中断されたかどうかをテストし、isInterrupted()自殺することを決定できます (たとえば、ループを終了します)。

于 2013-03-26T17:47:01.540 に答える
0

interrupt()を使用します。次に、InterruptedException

于 2013-03-26T17:47:24.700 に答える