SwingWorker: загрузка процессора 100%! - PullRequest
1 голос
/ 15 января 2012

В приложении My Swing есть таблица, которая заполняется, когда некоторые данные извлекаются из внешнего источника.Для отображения данных я использую поток SwingWorker, который вызывается из потока, который должен извлекать данные следующим образом:

 // SwingWorker Thread
 private class DisplayRowsTask extends SwingWorker<Void, Object[]> {

    private Vector<String[]> _data;

    @Override
    protected Void doInBackground() {
        while (_continue && !hasError()) {
            // some logic to fetch and place data in _data
            // data adjustment
            for (String[] row : _data) publish (row);
            _data = new Vector<String[]>();
        }
        return null;
    }

    @Override
    protected void process(List<Object[]> rows) {
        for (Object[] row : rows) ((DefaultTableModel)_table.getModel()).addRow(row);
    }
}

Отображаемые результаты верны, и все отлично работает, за исключением того, что загрузка ЦП100% (и более!), Особенно в ситуации, когда часто выбирается много данных.Как я могу ограничить это использование?

Другой вопрос, возможно, не полностью связанный: как я могу узнать, отображаются ли данные в таблице?Метод "SwingWorker.isDone ()" не предоставляет эту информацию

Ответы [ 2 ]

1 голос
/ 15 января 2012

не отвечает ....

не знаю, что вы пытались сделать, потому что я не смог сгенерировать 100% использование ЦП орудиями Essential Java правильно, если вы являетесь пользователем IDE, вы можете профилировать свой код со встроенным JProfiler, тогда вы можете увидеть все важные события из текущей JVM, однако в основном у вас есть три варианта

1) реализует Executor & SwingWorker , уведомление об ошибке take from Future

2) Оборачивая ваши методы в Runnable # Thread , вывод уведомлений в GUI должен быть заключен в invokeLater,

3) создайте ThreadFactory или реализует Executor , вывод уведомлений в GUI должен быть заключен в invokeLater, в некоторых случаях требуется в invokeAndWait

4) Вы можете моделировать / сравнивать с проблемами производительности Приложения на елку

1 голос
/ 15 января 2012

Ваш процессор естественным образом увеличивается до 100%, , потому что вы бездействуете while (!task.isDone()); в run().SwingWorker выполняется асинхронно, вызывая execute();, поэтому вам не нужно выполнять его в Thread.В любом случае вы не должны использовать Thread в Swing.SwingWorker делает работу.У него есть методы ловушки для вызова кода, когда он закончен.Если у вас много задач для выполнения, внедрите их в SwingWorker.

Примерно так:

   @Override
    protected Void doInBackground() {
      while (_continue && !hasError()) {
        // do some adjustments around _data
        for (String[] row : _data) publish (row);
       }
       return null;
    }

К другому вопросу: я думаю, addRow(...) вызывает событие.Ваша таблица должна получить это событие и лишить законной силы компонент.Если вы хотите выполнить код после выполнения SwingWorker, переопределите метод done().

...