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()
:Replaceboolean Done代码>带有对象doneLock
,将(!Done){}
时的替换为doneLock.wait()
;并替换Done=true使用doneLock.notify()
进行编码>。您还可以在java.util.concurrent
包中查看一些有用的机制<代码>倒计时闩锁
执行类似的操作。