[英]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.