Genau richtig. Aus der Dokumentation :
Es ist niemals legal, einen Thread mehr als einmal zu starten. Insbesondere darf ein Thread nach Abschluss der Ausführung nicht mehr neu gestartet werden.
In Bezug auf das, was Sie für wiederholte Berechnungen tun können, scheint es, als könnten Sie die SwokeUtilities-Methode invokeLater verwenden . Sie experimentieren bereits mit dem run()direkten Anrufen , was bedeutet, dass Sie bereits darüber nachdenken, Runnableein Raw anstelle eines Raw zu verwenden Thread. Versuchen Sie, die invokeLaterMethode nur für die RunnableAufgabe zu verwenden, und prüfen Sie, ob dies etwas besser zu Ihrem mentalen Muster passt.
Hier ist das Beispiel aus der Dokumentation:
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.");
Wenn Sie diesen printlnAufruf durch Ihre Berechnung ersetzen, ist er möglicherweise genau das, was Sie benötigen.
BEARBEITEN: Nach dem Kommentar hatte ich das Android-Tag im ursprünglichen Beitrag nicht bemerkt. Das Äquivalent zu invokeLater in der Android-Arbeit ist Handler.post(Runnable). Aus seinem 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.
*/
In der Android-Welt können Sie also dasselbe Beispiel wie oben verwenden und das Swingutilities.invokeLaterdurch den entsprechenden Beitrag in a ersetzen Handler.