我正在使用线程在我的应用程序中滚动文本:
public void run() {
super.run();
while (!isInterrupted()) {
if (X >= -getPreferredSize().getWidth()) {
X -= 2;
} else {
decrementMessagesInList(getMessages());
addMessage(getMessages());
prepare();
X = getParentWidth();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
repaint();
}
}
但是,看到 sleep 后我的 CPU 使用率非常高,我需要减少它。谁能建议如何做?
最佳答案
如果我可以假设您的代码只需要滚动文本来响应某些事件(例如单击或拖动或其他事件),那么您应该让您的线程进入等待状态,然后让触发更新的代码向线程发送通知,然后线程将唤醒并执行更新。像这样的事情:
Object syncObj = new Object();
public void run() {
while (true) {
try {
syncObj.wait();
if (X >= -getPreferredSize().getWidth()) {
X -= 2;
} else {
decrementMessagesInList(getMessages());
addMessage(getMessages());
prepare();
X = getParentWidth();
}
repaint();
} catch (InterruptedException ie) {
// handle the exception
}
}
}
然后在处理/生成导致需要滚动的事件的代码中
public void onClick(..) {
syncObj.notifyAll();
}
您还需要防止线程的虚假唤醒,以确保您正在等待的事件确实发生。请参阅Do spurious wakeups actually happen? .
关于java - Thread 中的 repaint() 导致 CPU 使用率很高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33332389/