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

你的程序是正确的。使用线程时,我建议您使用 log4j 而不是 system.out.println。配置 log4j 以将输出发送到文件。

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

于 2012-07-15T17:35:40.890 回答