Wenn dies Ihr erster Besuch hier ist,
lesen Sie bitte zuerst die Hilfe - Häufig gestellte Fragen
durch. Sie müssen sich vermutlich registrieren,
bevor Sie Beiträge verfassen können. Klicken Sie oben auf 'Registrieren', um den Registrierungsprozess zu
starten. Sie können auch jetzt schon Beiträge lesen. Suchen Sie sich einfach das Forum aus, das Sie am meisten
interessiert.
ein Thread der mit stop() beendet wurde kann das Objekt auf dem er gearbeitet hat in einem inkonsistenten Zustand verlassen - daher die Deprecation. Näheres auch in der Doku bzw im Tutorial. Wenn der Zustand - also der Informationsinhalt - eines solchen Objektes nach dem Aufruf von stop() nicht mehr weiterverarbeitet wird, dann kannst du die Methode weiterhin benutzen.
Andernfalls ist das Stoppen am besten mit einer Kombination aus einem booleschen Flag und der Methode interrupt() zu bewerkstelligen.
Arbeitet ein Thread auf einem Objekt in einer while - Schleife, dann
kann die Beendigung durch das Flag durchgeführt werden:
volatile boolean running = true;
<pre>
while(running == true)
{
aObject.doSomething();
}
</pre>
Wenn die Arbeit beendet werden soll, dann das Flag einfach auf false setzen (while ist in der run() Methode des Threads).
Die Methode interrupt() bringt hier nichts, die Schleife wird nicht beendet.
Wenn aber in der Methode doSomething wait() bzw. sleep() aufgerufen werden, dann verursacht der Aufruf von interrupt() eine InterruptedException. Diese reichst du durch erneutes Werfen an die run() Methode weiter die sich ihrerseits beendet.
Wenn du hier running == false setzt und der Thread durch wait() oder sleep() pausiert, dann wird die Schleife erst beendet wenn der Thread zurückkehrt - durch den Aufruf von interrupt() hingegen sofort.
<br>
Also könnte die stop Methode so aussehen
<pre>
public void stopMe()
{
running == false;
interrupt();
}
</pre>
public class Frame extends JFrame {
FlowLayout flowLayout1 = new FlowLayout();
JButton button1 = new JButton("START");
JButton button2 = new JButton("STOP");
MainThread mThread = new MainThread();
public Frame() {
this.getContentPane().setLayout(flowLayout1);
Hi Thomas,<BR>
dank deines Tipps funktioniert fast alles.<BR>
Zwei fragen noch:<BR>
<B>1.</B> Wie kann der Start-Button deaktiviert werden, während der Thread aktiv ist (mit isAlive funktioniert diese Abfrage nicht)<BR>
<B>2.</B> Wie kann ich diesen Thread nach dem Abbruch, wieder von vorne starten.<BR>
entweder über eine Überwachungsthread - das ist ein wenig komplizierter, oder du schreibst einfach button1.setEnabled(false)
nach mThread.start();
In deinem Stop Listener schreibst du dann button1.setEnabled(true)
Zu 2:
Du musst den Thread mit new neu erzeugen. Sobald run() beendet wird,
ist der Thread beendet. Wenn du ihn nur pausieren lassen willst, dann
musst du mit wait() und notify() oder auch mit sleep() arbeiten.
isAlive() zeigt nur an dass der Thread schon gestartet wurde.
Comment