Совершенно верно. Из документации :
Нельзя начинать тему
больше чем единожды. В частности,
поток не может быть перезапущен, как только он
завершил выполнение.
С точки зрения того, что вы можете сделать для повторных вычислений, кажется, что вы можете использовать SwingUtilities, метод invokeLater . Вы уже экспериментируете с непосредственным вызовом run()
, то есть вы уже думаете об использовании Runnable
вместо необработанного Thread
. Попробуйте использовать метод invokeLater
только для задачи Runnable
и посмотрите, подходит ли он вашему ментальному образцу немного лучше.
Вот пример из документации:
Runnable doHelloWorld = new Runnable() {
public void run() {
// Put your UI update computations in here.
// BTW - remember to restrict Swing calls to the AWT Event thread.
System.out.println("Hello World on " + Thread.currentThread());
}
};
SwingUtilities.invokeLater(doHelloWorld);
System.out.println("This might well be displayed before the other message.");
Если вы замените этот вызов println
своими вычислениями, это может быть именно то, что вам нужно.
РЕДАКТИРОВАТЬ: после комментария я не заметил тег Android в оригинальном сообщении. Эквивалентом invokeLater в работе Android является Handler.post(Runnable)
. Из его Javadoc:
/**
* Causes the Runnable r to be added to the message queue.
* The runnable will be run on the thread to which this handler is
* attached.
*
* @param r The Runnable that will be executed.
*
* @return Returns true if the Runnable was successfully placed in to the
* message queue. Returns false on failure, usually because the
* looper processing the message queue is exiting.
*/
Итак, в мире Android вы можете использовать тот же пример, что и выше, заменив Swingutilities.invokeLater
соответствующим постом на Handler
.