java - Thread 中的 repaint() 导致 CPU 使用率很高

标签 java multithreading swing

我正在使用线程在我的应用程序中滚动文本:

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/

相关文章:

java - 如何在矩形中创建矩形?

java - 阻止 objectweb asm 用 throw 替换无法访问的代码

java - 使用 GSON 从 JSON 转换,无法将 ArrayList 转换为对象

java - 最小化利润,工作安排与最后期限

c# - 为什么对级联 ManualResetEvent 的多次等待会使执行时间增加三倍?

php - 进行具有不同参数的多个curl请求的最佳实践是什么?

swing - 使用跷跷板启用全屏?

java - 将对象转换为双 Scriptengine

java - 通过不同的线程访问变量和 Swing 组件

java - 在jlist中添加图片