簡體   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