gpt4 book ai didi

java - 使用 while 循环轮询的建议替代方法是什么

转载 作者:行者123 更新时间:2023-11-29 10:19:54 26 4
gpt4 key购买 nike

所以这是我的代码,用于轮询应用程序模型的更改。

    Thread refreshThread = new Thread(new Runnable() {

public void run() {

while(true)
{
if(TasksManager.isDirty())
{
TasksManager.refreshTasks(true);
panel.repaint();
}
}
}
});
refreshThread.start();

现在它是一个巨大的 CPU pig 。这是发生的事情的细目。

  1. TaskManager 意识到添加了一些新内容。
  2. TaskManager 将自己标记为脏。
  3. 当我的刷新线程发现它变脏时,它会立即对模型和显示面板执行刷新。
  4. 在 RefreshTasks() 结束时,模型再次标记为干净。

我不希望 TaskManager 开始刷新,因为它不包含对查看面板的任何引用。

我的一个想法是使用 condition.await()。 TaskManager 可以在它被标记为脏时发出信号。但我看到锁和条件是齐头并进的。在函数开头不获取 Lock 就可以使用 Condition 吗?

最佳答案

您可以使用 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
}
}

关于java - 使用 while 循环轮询的建议替代方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8334911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com