0

volatile 変数を使用して実行中のスレッドを別のスレッドから停止するシナリオをテストしています。なぜ機能しないのだろうか。問題はどこだ?私のコードは次のとおりです。

public class StoppableTask extends Thread {
    private  volatile boolean pleaseStop;

    public void run() {
       System.out.println("Running..");
       while (!pleaseStop) {
           System.out.println("Working...");
       }
    }
    public void tellMeToStop() {
        pleaseStop = true;
    }
}

public class Stopper extends Thread {
    StoppableTask t ; 

    public Stopper(StoppableTask t){
        this.t=t;
    }
    public void run(){
        System.out.println("Ok..running too..");
        try {
            System.out.println("Waiting..");
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t.tellMeToStop();
        System.out.println("Done Waiting..");
    }

    public class QuickTest{

        public static void main(String[] args) {
        StoppableTask t = new StoppableTask();
        Stopper s = new Stopper(t);
        t.start();
        s.start();

    }
 }
4

2 に答える 2

4

あなたのプログラムが端末に大量の出力を出力しているため、出力が表示されるのを待ってブロックしていると思われます。止まっていないように見えますが、実際には止まります。あなたはただ待つ必要があります...長い間...

その出力を遅くするには、スピンループThread.sleep(100);の内側に入れる必要があります。それを行う別の方法は、を削除して、カウンターまたは何かをインクリメントすることです。while()StoppableTask.run()System.out

試してみたところ、プログラムは予想どおり5秒で終了します。

public void run() {
    System.out.println("Running..");
    while (!pleaseStop) {
        // System.out.println("Working...");
    }
    System.out.println("Stopped task Done");
}
于 2012-07-13T17:05:11.670 に答える
0

あなたのプログラムは正しいです。スレッドを操作するときは、system.out.println の代わりに log4j を使用することをお勧めします。出力をファイルに送信するように log4j を構成します。

ファイル内の文字列パターンを検索できます。その分析は簡単です。

于 2012-07-15T17:35:40.890 に答える