[英]what is a suggested alternative to polling using a while loop
因此,这是我的代码,轮询我的应用程序模型中的更改。
Thread refreshThread = new Thread(new Runnable() {
public void run() {
while(true)
{
if(TasksManager.isDirty())
{
TasksManager.refreshTasks(true);
panel.repaint();
}
}
}
});
refreshThread.start();
现在这是一个巨大的CPU吞噬。 这是发生的事情的细分。
我不希望TaskManager开始刷新,因为它不包含对“查看面板”的任何引用。
我有一个想法是使用condition.await()。 当已将其标记为脏状态时,TaskManager可以发出信号。 但我看到“锁与条件”齐头并进。 使用条件而不在函数开始时获取Lock可以吗?
您为什么不为此使用监听器?
如果您有一个简单的TasksManager子类,称为ContentChangedListener。 然后,您可以在有兴趣的人向TasksManager注册的侦听器中声明panel.repaint()东西。 可以根据需要注册许多侦听器。
代替将TasksManager标记为脏的代码,将其替换为一个循环,以通知所有侦听器更改。
该解决方案的优点是不需要另一个线程或循环。
您可以使用wait()
和notifyAll()
来避免高CPU使用率:
private final Object dirtyLock = new Object();
Thread refreshThread = new Thread(new Runnable() {
public void run() {
while(true){
synchronized(dirtyLock){
dirtyLock.wait(); // Send this thread to sleep until dirtyLock is unlocked
}
TasksManager.refreshTasks(true);
panel.repaint();
}
});
refreshThread.start();
// When your TaskManager becomes dirty, do the following
public void changeToDirty(){
TaskManager.setDirty(true);
synchronized(dirtyLock){
dirtyLock.notifyAll();
// this will release the refresh thread which will repaint and then go to sleep
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.