繁体   English   中英

有什么建议可以代替使用while循环进行轮询

[英]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吞噬。 这是发生的事情的细分。

  1. TaskManager意识到已经添加了一些新内容。
  2. TaskManager将自身标记为脏。
  3. 当我的刷新线程发现其脏污时,它将立即在模型和显示面板上执行刷新。
  4. 在RefreshTasks()的末尾,该模型再次被标记为干净。

我不希望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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM