Java 带有摆动计时器的抽象类

Java 带有摆动计时器的抽象类,java,Java,我有一个抽象类,如下所示: abstract class Grapher implements Runnable{ ... member variables... Timer timer; boolean Done; public void run(){ Done = false; timer.start(); while(!Done){} } public void Grapher(){ //crea

我有一个抽象类,如下所示:

abstract class Grapher implements Runnable{
  ... member variables...
  Timer timer;
  boolean Done;

   public void run(){
          Done = false;
          timer.start();
          while(!Done){}
   }

   public void Grapher(){ //create graph}
   ...
   }
我想让这个抽象线程创建一个图形。然后我想扩展这个类,以提供应该在图上绘制哪些数据的实现。例如:

class RandomGraph extends Grapher{
   ActionListener taskPerformer;

   public RandomGraph(){
      timer = new Timer(1000, taskPerformer);
        taskPerformer = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
               // generate random data and add it to the graph data;
               // if ... Done = true
             }

         };
  }}
然后将随机数据绘制到图形中。我遇到的问题是,当(!done)循环时,我完全陷入了
中。将System.out.printlns放入actionListener中,告诉我计时器似乎不工作,因为控制台上没有显示任何内容


我使用线程是不是很愚蠢?我认为如果我希望图形每隔几毫秒绘制一次数据,这可能是一个好主意。

您正在将
null
传递给
计时器
构造函数-您需要先初始化
taskPerformer

为了解决你更大的问题:不,你不笨使用线程。然而,我怀疑您在这里使用抽象类。您真正需要的是一个接口
Grapher
描述一个绘制图形的对象,然后是
Runnable
(比如,
GrapherRunner
)的一个具体子类,它设置计时器,然后委托给一个Grapher来完成工作


(在OO语言中,这意味着使用组合而不是继承。)

啊,多么愚蠢的错误。碰巧,它似乎仍然不起作用。它仍然卡在while循环中。如果我删除while循环,它会正常工作。我想我会采纳你的建议,尝试用一个接口重写它。我感谢帮助人员,谢谢:)啊,是的,您需要将
Done
设置为volatile字段(
volatile boolean Done;
),以便使用它以这种方式在线程之间进行通信。否则,一个线程可以更改它,而另一个线程将永远不会知道它已更改。不过,您真正想要的是类似于
对象的东西。wait()
对象。notify()
:Replace
boolean Done带有
对象doneLock
,将(!Done){}
时的
替换为
doneLock.wait()
;并替换
Done=truedoneLock.notify()
进行编码>。您还可以在
java.util.concurrent
包中查看一些有用的机制<代码>倒计时闩锁
执行类似的操作。