Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Как запустить поток второй раз?


Автор: 4epT 29.5.2010, 21:38
Добрый вечер! Имеется класс ... в нем есть экземпляр класса который наследуется от Thread. Инициализация этой переменной происходит при вызове конструктора. По нажатию на кнопку вызывает запускается поток, но при повторном запуске (когда жмешь второй раз на кнопку) вылетает исключение, как этого избежать? как "сказать" потоку что нужно выполняться заново ? Повторно создать экземпляр этого класса не получается , потому что те переменные что передаются в конструктор должно быть финал.
Спасибо!

Автор: pathfinder 29.5.2010, 22:52
Завершившийся поток нельзя повторно использовать.

Если нужно какие-либо действие производить в отдельном потоке совершенно не обязательно соответствующий класс наследовать от 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();
    }
});


Автор: yeputons 2.6.2010, 00:22
А может так будет красивее?
Код

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

Автор: pathfinder 2.6.2010, 10:13
yeputons, ваш код действительно на первый взгляд красивее, однако в нем учитывается тот факт, что после выполнения задачи будет необходимость выполнения некоторых завершающих действий, непосредственно к задаче отношения не имеющих. Например в данном случае это включение "кнопки запуска задачи".

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)