Thread中的repaint()正在使用高CPU

时间:2015-10-25 16:58:15

标签: java multithreading swing

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

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();
    }
}

然而,看到睡眠时我的CPU使用率非常高,我需要减少它。谁能建议怎么做?

1 个答案:

答案 0 :(得分:0)

如果我可以假设您的代码只需要滚动文本以响应某些事件(例如点击或拖动或其他东西),那么您应该让您的线程进入等待状态然后让代码触发更新将通知发布到线程,然后唤醒并执行更新。像这样:

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?