我正在测试使用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();
}
}
答案 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将输出发送到文件。
您可以在文件中搜索字符串模式。它易于分析。