0

それが私の質問です。どうすればスレッドを停止させることができますか。私はスレッドにあまり精通していませんが、読んだわずかな情報から、これでうまくいくはずだとわかります。

public class testestes {
    static volatile boolean key;

    public static void main (String []args)
    {
        key=true;
        Thread thread=new Thread(new Runnable()
        {
            public void run()
            {
                while(key)
                {
                    System.out.println("running");
                }
            }
        });

        thread.start();
        key=false;
    }
}
4

5 に答える 5

2

スレッドを終了する必要があるかどうかを確認するためa を使用しません。フィールド修飾子として使用する場合、これは確実に機能しますが、コードがより複雑になると、代わりにループ内で他のブロッキング メソッドを使用すると、コードがまったく終了しないか、少なくとも時間がかかることがあります。したいかもしれません。booleanvolatilewhile

一部のブロッキング ライブラリ メソッドは割り込みをサポートしています。

すべてのスレッドには、ブールフラグの割り込みステータスが既にあり、それを利用する必要があります。次のように実装できます。

public void run() {

   try {
      while(!Thread.currentThread().isInterrupted()) {
         // ...
      }
   } catch (InterruptedException consumed)
      /* Allow thread to exit */
   }

}

public void cancel() { interrupt(); }

Java Concurrency in Practiceから取得したソース コード。メソッドは公開されているため、cancel()必要に応じて別のスレッドにこのメソッドを呼び出させることができます。

interrupted現在のスレッドの中断されたステータスをクリアする、不適切な名前の静的メソッドもあります。

于 2012-07-05T22:47:18.077 に答える
1

thread.start();ではなく、電話をかけたいthread.run();。run()はフォークしません。

また、フォークした直後にfalseに設定されているため、「実行中」の出力が表示されない場合があります。そのkeyため、フォークされたスレッドが入るrun()と、keyはすでにfalseになっています。

于 2012-07-04T01:21:46.687 に答える
0

これを行うための基本的なレイアウトは、Runnableを実装するクラスを実際に持つことです。

public class SampleThread implements Runnable
{
  private volatile boolean stopFlag = false;

  public void stopThisThread()
  {
    stopFlag = true;
  }

  public void run()
  {
    while (!stopFlag)
    {
      //doStuff
    }
  }
}

その後、他の場所

SampleThread sample = new SampleThread();
new Thread(sample).start();
//Then when you want to kill it...
sample.stopThisThread();
于 2012-07-04T02:31:29.417 に答える
0

でスレッドを中断することを検討することをお勧めしますThread.interrupt()。Javaチュートリアルにそれについての良い記事があります。

ブールフラグを示唆する答えも同様に正しいです。いずれの場合も、スレッドを終了する必要があるかどうかを確認するために、どこかで条件ステートメントをチェックインします。終了の条件は、スレッドが中断されたか、ブールフラグが設定された(選択した実装に応じて)可能性があります。

警告の最後の言葉:Thread.stop()は絶対に使用しないでください。正当な理由で非推奨になりました。良い説明については、ここを参照してください。

于 2012-07-04T06:25:28.130 に答える
0

簡略化されたコードで提示された手法が機能するはずです。少なくともデスクトップで動作することを確認できます。簡略化されたバージョンをローカルでテストしましたか?非静的変数の使用や、満たす必要のある追加の条件など、実際のバージョンでここに表されていないことが起こっている可能性があります。

于 2012-07-04T03:21:13.780 に答える