Лучшая практика при использовании потоков в SWING / Java в целом - PullRequest
3 голосов
/ 12 июля 2011

У меня есть пользовательский интерфейс SWING, содержащий кнопку, которая создает новый поток SwingWorker.Затем этот поток запрашивает результаты в базе данных SQLite, чтобы поместить их в JTable.В моем конструкторе StringWorker параметры представляют собой различные поля, взятые из других компонентов SWING, таких как JSpinner, JComboBoxes и т. Д.

Поскольку я новичок во всем этом, я хотел бы получить совет от болеезнающие программисты о том, как я должен делать то, что я хочу делать.

  1. Я хотел бы знать, автоматически ли заканчиваются потоки, когда я закрываю программу с помощью System.exit (0);поэтому у меня не возникает утечек памяти

  2. Каков наилучший способ убедиться, что у меня нет двух потоков, одновременно обращающихся к моей базе данных (скажем, пользователь нажимаетнесколько раз на кнопке или, в другом случае, администратор обновляет базу данных с некоторыми файлами в качестве входных данных (в моей программе), затем, пока первый поток выполняет синтаксический анализ файлов и обновляет базу данных, он хочет запросить базу данных с помощью кнопки, так далее.).

  3. Медленнее ли использовать потоки?Сначала я делал все свои расчеты прямо в EDT, и, конечно, пользовательский интерфейс блокировался каждый раз после нажатия кнопки, но он блокировался только на 5 секунд, если я правильно помню.Теперь, когда я нажимаю кнопку, она не блокируется, но кажется, что результат отображается в JTable примерно в два раза дольше.Это потому, что я допустил ошибку в своем коде или это нормально?

Я думаю об использовании статического поля в классе, в котором находятся запросы, и установке его в значение true, если оно используется,Это правильный способ сделать это?Таким образом, независимо от того, какой поток использует базу данных, второй поток не запустится.

Ответы [ 2 ]

3 голосов
/ 12 июля 2011
  1. Если это не является абсолютно необходимым (не должно быть), не используйте выход System # в вашем коде.Вот несколько объяснений почему и что лучше.

  2. Ваша база данных способна обрабатывать два одновременных запроса, так что это само по себе неплохо.Если вы используете JDBC и его пул соединений через DataSource, то вам, вероятно, следует ограничить использование одного такого соединения одним потоком за раз.Чтобы решить проблему наличия избыточных запросов к базе данных, например, при «двойном нажатии», возможно, существует более одного решения.Здесь я предполагаю, что вы имеете в виду сценарий, в котором у вас есть Swing UI, который раздается нескольким людям, и каждый из этих экземпляров обращается к одной и той же базе данных -> просто отключите вашу кнопку, пока выполняется запрос к базе данных.

  3. Это немного медленнее, если вы не запускаете свой код непосредственно в потоке диспетчеризации событий из-за планирования выполнения ваших рабочих, но это не должно быть заметным.Чтобы увидеть, что идет не так, мне нужно увидеть соответствующий код.

3 голосов
/ 12 июля 2011

Я хотел бы знать, завершаются ли потоки автоматически при закрытии программы с помощью System.exit (0);

Да. Весь процесс закончится и потоки, которые являются частью этого процесса. Однако, если вы не вызовете System.exit(), все потоки, не относящиеся к демонам, должны завершиться до завершения процесса.

Как лучше всего убедиться, что у меня нет двух потоков, обращающихся к моей базе данных одновременно

Поскольку это приложение Swing, я предполагаю, что и вы, и администратор не можете получить доступ к приложению одновременно. Однако, чтобы гарантировать, что даже в одном приложении вы не можете запустить более одной операции, влияющей на базу данных, вы должны заблокировать пользовательский интерфейс. Либо отключите кнопки, либо поместите стеклянную панель поверх пользовательского интерфейса. Модальное диалоговое окно прогресса также полезно.

Медленнее ли использовать потоки?

Нет, это не медленнее, если все сделано правильно. Медленная работа займет столько времени, сколько потребуется. Вы не можете исправить это с помощью потоков, но вы можете либо сохранить скорость (воспринимаемую) одинаковой, обеспечивая хороший, не блокирующий пользовательский интерфейс, либо вы можете выполнять более одной медленной операции за раз и, следовательно, увеличить эту воспринимаемую скорость.

...