Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как запустить поток второй раз? 
:(
    Опции темы
4epT
Дата 29.5.2010, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Добрый вечер! Имеется класс ... в нем есть экземпляр класса который наследуется от Thread. Инициализация этой переменной происходит при вызове конструктора. По нажатию на кнопку вызывает запускается поток, но при повторном запуске (когда жмешь второй раз на кнопку) вылетает исключение, как этого избежать? как "сказать" потоку что нужно выполняться заново ? Повторно создать экземпляр этого класса не получается , потому что те переменные что передаются в конструктор должно быть финал.
Спасибо!
PM MAIL   Вверх
pathfinder
Дата 29.5.2010, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: 2
Всего: 10



Завершившийся поток нельзя повторно использовать.

Если нужно какие-либо действие производить в отдельном потоке совершенно не обязательно соответствующий класс наследовать от Thread. Пишите всю логику в отдельный класс, и запускайте ее в отдельном потоке примерно вот так.

Код

public class SomeLogic {

    public SomeLogic(/* todo */) {
        // todo
    }

    public void doLogic() {
        // todo
    }
}

// использование ...
final SomeLogic logic = new SomeLogic(/**/);

JButton button = new JButton("ThreadAction");
button.addActionListener(new ActionListener() {
    public void actionPerformed(...) {
        button.setEnabled(false);
        new Thread(new Runnable() {
            public void run() {
                try {
                    logic.doLogic();
                } catch(Exception ex) {
                    // todo: log ...
                } finally {
                     // button.setEnabled(true); // <-- не правильно, такие действия можно выполнять только из потока Swing
                     SwingUtilites.invokeLater(new Runnable() {
                         public void run() {
                             button.setEnabled(true);
                         }
                     }
                }
            }
        }).start();
    }
});



Это сообщение отредактировал(а) pathfinder - 2.6.2010, 10:14
PM MAIL   Вверх
yeputons
Дата 2.6.2010, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 1.4.2009
Где: Санкт-Петербург

Репутация: 1
Всего: 5



А может так будет красивее?
Код

public class SomeLogic implements Runnable {
    public SomeLogic(/* todo */) {
        // todo
    }
    public void run() {
        // todo
    }
}
// использование ...
final SomeLogic logic = new SomeLogic(/**/);
JButton button = new JButton("ThreadAction");
button.addActionListener(new ActionListener() {
    public void actionPerformed(...) {
        button.setEnabled(false);
        new Thread(logic).start();
    }
});

PM MAIL ICQ Skype   Вверх
pathfinder
Дата 2.6.2010, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: 2
Всего: 10



yeputons, ваш код действительно на первый взгляд красивее, однако в нем учитывается тот факт, что после выполнения задачи будет необходимость выполнения некоторых завершающих действий, непосредственно к задаче отношения не имеющих. Например в данном случае это включение "кнопки запуска задачи".
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0632 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.