Как реализовать нить в моем домашнем настольном приложении - PullRequest
1 голос
/ 19 января 2012

Я создал настольное приложение, которое подключилось к базе данных, функция add-delete-modify. Я делаю это отдельно от 3 JInternalFrame.

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

Теперь мой вопрос: как реализовать поток для моего приложения, чтобы я мог запускать столько же функций в одном оконном приложении?

Ответы [ 5 ]

2 голосов
/ 19 января 2012

Долгосрочные задачи (например, массовое обновление) не должны выполняться в потоке диспетчеризации событий (потоке, в котором выполняются все операции с графическим интерфейсом), иначе, как вы заметили, графический интерфейс зависает.

Используйте SwingWorker для выполнения ваших долгосрочных задач в фоновом потоке.Его Javadoc имеет полезный пример, и он также описан в учебнике Swing .

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

Многопоточность в java теперь очень проста с добавлением [java.util.concurrent.][1]

Что вам нужно сделать, это

  1. разбить 500 заказов на работу на меньшие партии, скажем, 10за партию
    1. Создание пула потоков с настроенным числом потоков, скажем, 10 потоков.
    2. Создание задачи Runnable / callable , которая будет принимать эти пакетыиз общего места и выполняйте операции CRUD на БД.
    3. Вам также понадобится общая структура данных, в которой будут результаты этих операций CRUD.Поэтому, когда Runnable / callable задача завершает свою операцию, она обновляет эту структуру данных с результатом операции
    4. Также имейте в виду, что доступ к этим даннымструктуры - та, которая содержит пакет заказов, - та, которая содержит результат операций, должна быть синхронизирована.

Для пула потоков вы можете использовать один из

Executors.newFixedThreadPool or Executors.newCachedThreadPool()
0 голосов
/ 19 января 2012

Что вам нужно сделать, это отделить ваш класс пользовательского интерфейса от класса доступа к базам данных и модификаций.Затем вы можете из своего пользовательского интерфейса вызывать что-то вроде этого:

new Thread(new Runnable()
{
    public void run()
    {
        //Call database stuff here
    }
}).start();

Обратите внимание, однако, что одновременное выполнение большого количества операций с базой данных может привести к ошибкам, тем более что база данных может блокировать таблицык которому он сейчас читает / пишет.Я советую вам придерживаться одной операции за раз и использовать потоки, чтобы отобразить индикатор выполнения или нечто подобное.

0 голосов
/ 19 января 2012

Я бы просто использовал:

new Thread(new Runnable()
{
    public void run()
    {
        //Things to do in new thread...
    }
}).start();

Или, если вы хотите использовать это часто, вы можете создать класс, который реализует Runnable, так что вам не нужно переписывать все в функции run ().

0 голосов
/ 19 января 2012

Взгляните на Swing Threads .

Особенно на:

SwingUtilities.invokeLater()
...