一个线程没有停止其他。即使有波动变量

时间:2012-07-13 16:54:31

标签: java multithreading volatile

我正在测试使用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();

    }
 }

2 个答案:

答案 0 :(得分: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");
}

答案 1 :(得分:0)

您的计划是正确的。 使用线程时,我建议您使用log4j而不是system.out.println.Configure log4j将输出发送到文件。

您可以在文件中搜索字符串模式。它易于分析。