Thread beenden (gnadenlos und ohne rücksicht auf Verluste) ?

Status
Nicht offen für weitere Antworten.

Oli

Top Contributor
Hallo,

ich habe einen Thread der mir Daten aus einer Datenbank schaufelt. Dieser wird vom Benutzer über einen Button gestartet. (In der Applikation gibt es mehrere Buttons, die verschiedene Tabellen auslesen und die Daten auswerten). Das ganze ist auch timergesteuert ist (also wenn Daten angezeigt werden, dann werden diese alle 10 Min. aktualisiert).
Mein Problem ist nun, dass ich erreichen möchte, dass wenn ein Button gedrückt wird und Daten geholt werden und in dieser Zeit ein zweiter Button gedrückt wird, dass der erste Thread gekillt wird. Imoment löse ich das indem ich den thread = null setze, aber ich glaube, das ist nicht die beste lösung...

Wie kann ich einen Thread beenden und eben wie oben geschrieben, gnadenlos und ohne rücksicht auf Verluste ?

Thread.stop() ist ja veraltet....

Grüße Oli
 

Niki

Top Contributor
Ich bezweifle dass du den Thread killst indem du die Referenz auf null setzt...

Ist es richtig dass du den Thread einfach schlafen legst und der nach 10 Minuten weiter arbeitet? Wenn du es sauber machen willst solltest du es ca. so machen:

Code:
public class MyRunnable implements Runnable{
  private boolean running = true;

  public void run(){
    while(running){
      //tu hier was
      synchronized(this){
        //10 Minuten warten
        try{
          this.wait(10 * 60 * 1000);
        }catch(InterruptedException ex){
        }
      }
    }
  }

  public synchronized void stop(){
    running = false;
    this.notify();
  }
}

Wird vom Runnable Objekt die stop Methode aufgerufen wird sofort beendet, und das ganze ist auch noch schön sauber.
 

GRudiD

Aktives Mitglied
Du hast doch in der run()-Methode eine Schleife zu laufen. In der musst du nur abfragen, ob ein bestimmter Wert (boolean abbrechen) true ist (sollte man per Klick auf deinen Abbrechen-Button setzen können). Dann verlässt du die Schleife, die Methode wird korrekt beendet und der Thread anschließend auch.

Bsp:
Code:
public boolean abbrechen = false;
public void run() {
 // hole Daten aus DB
 while (resultSet.next()) {
  if (abbrechen)
   break;
  // tue was
 }
}
 

Oli

Top Contributor
Hi,

ja so hab ich das ja auch. Allerdings ist das Problem das die Daten nicht nur aus der DB geholt werden, sondern verschiedene Prozeduren aufgerufen werden, die Berechnungen durchführen. Naja und dann wird auch noch das UI gebaut und upgedatet...
Dann müsste ich nach jeder Rückkehr aus einer Prozedur abfragen ob running == true, wenn nicht, dann break?

Grüße Oli
 

Niki

Top Contributor
Richtig, aber nicht break, sondern return :)
So programmiert man multithreaded. Der Thread muss selber wissen ob er weiter laufen darf oder nicht, und das macht man halt am besten über Flags. Bei jeder Schleife sollte dieses Flag abgefragt werden und nach jeder atomaren (heißt das so) Funktion/Transaktion.
 
G

Gast

Gast
bei aktionen, die sehr lange dauern können, sollte man sich zusätzlich überlegen, die neue aktion sofort in einem weiteren thread zu starten und dem bereits laufenden schlicht mitzuteilen, dass er bei nächster gelegenheit die arbeit einstellen und die ergebnisse verwerfen kann.

wenn man sowas nicht macht, kann es recht schnell passieren, dass z.b. lange datenbankabfragen, die schon gar nicht mehr benötigt werden, die abarbeitung neuer aufgaben verzögern,
 
B

Beni

Gast
Der übliche Weg Threads anzuhalten ist der "interrupt"-Mechanismus.

Von dem kommt auch die ominöse "InterruptException", denn wenn auf einem Thread interrupt aufgerufen wird, werden alle Pausen und auch IO-Operationen automatisch abgebrochen.
 

FArt

Top Contributor
Beni hat gesagt.:
Der übliche Weg Threads anzuhalten ist der "interrupt"-Mechanismus.

Von dem kommt auch die ominöse "InterruptException", denn wenn auf einem Thread interrupt aufgerufen wird, werden alle Pausen und auch IO-Operationen automatisch abgebrochen.

Die InterruptedException wird aber nur geworfen, wenn ein Thread gerade blockiert (wait, sleep, blockierender Socket...). Ein laufender Thread muss regelmäßig abfragen, ob er unterbrochen werden soll, z.B. mit Thread.currentThread().isInterrupted().

Nikis Variante ist übrigens auch nicht konsistent. Das Flag (running) muss mit dem Schlüsselwort volatile deklariert werden, weil sonst der Thread u.U. das setzen des Flags nicht mitbekommt (siehe JSR-133 oder die Java-Spec oder als Tipp an den Ursprungsposter: schau doch mal selber bei SUN bevor du postest, einfach über Google zu finden: http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html)
 

Niki

Top Contributor
Das mit dem volatile überreiß ich nicht ganz. Warum sollte das der Thread nicht mitbekommen? Könntest du das etwas näher erläutern?
 

FArt

Top Contributor
Die VM darf hier eine Optimierung vornehmen: in der Schleife kann (muss aber nicht) der Wert aus der Variable aus Gründen der besseren Performance im Prozessorchache oder einem Register vorgehalten werden. Mit dem Identifier "volatile" wird dies verhindert.

Diese Optimierung macht nur bei konkurrierenden Zugriffen Probleme, deswegen muss der Entwickler um eine korrekte Synchronisation kümmern. Wer mit Nebenläufigkeiten arbeitet, muss m.E. die JSR-133 einmal gelesen haben... viele werden überrascht sein...
 

Niki

Top Contributor
Bei dieser Schleife gibts ja gar nichts zu optimieren, da wird ja nichts im Körper gemacht sondern nur abgefragt.
Bei so einer Schleife hätte es ja Sinn:
Code:
for(int i = 0; i < 1000000; i++){
  count += i;
}

Aber bei meiner Schleife finde ich nicht
 

FArt

Top Contributor
Schau dir doch einfach das von mir verlinkte Beispiel von SUN an und lies dir die JSR durch...

Volatile benötigt man nicht nur bei 64bittigen Werten und lokalen Zählern.

Deine Lösung ist inkonsistent, weil du zwar die stop-Methode synchronisiert hast, aber das Flag auch außerhalb der Synchronisation gelesen wird. Das kann vom Compiler derart optimiert werden, dass die while-Schleife immer einen Wert auswertet, der nicht frisch aus dem Heap stammt.

Volatile verhindert das. Außerdem spart man sich dann notify() und wait() und den relativ langsamen Monitor über den synchronized-Block... und nicht zuletzt das, macht den Code unkomplizierter und lesbarer...
 

Niki

Top Contributor
Wie kann man sich wait und notify sparen? Ohne denen werd ich den Thread kaum für 10 Minuten warten lassen können bzw. früher aufwecken, falls notwendig.
 

FArt

Top Contributor
Thread#sleep und wie schon erwähnt Thread#interrupt behandeln. Damit kann man sich übrigens auch das Flag sparen. Beni hat schon gesagt wie man das macht.

Deine Technik wird von SUN vorgeschlagen um suspend und resume zu realsieren. Allerdings steckt der Teufel (der in deren Fall die Konsistenz schafft) im Detail: das Flag um das es geht wird nur in kritischen Bereichen (mit synchronized abgesichert) verwendet... im Unterschied zu deinem Vorschlag, wo das auch außerhalb passiert. Nur dann ist die Konsistenz gegeben!!

Aber wie gesagt: einfach dem Link folgen, da steht das alles...
 

Niki

Top Contributor
Ich weiß dass das Flag auch außerhalb von synchronized abgefragt wird. Was wäre wenn man es so löst:
Code:
while(true){
  synchronized(this){
    if(!running){
      return;
    }
  }
  //tu was
  synchronized(this){
    try{   
      this.wait(10 * 60 * 1000);
    }catch(InterrupedException ex){
   }
  }
}
 

FArt

Top Contributor
Yepp, bzgl. dem Flag "running" wäre das ok, denn jetzt wird die Variable konsistent gelesen/geschrieben, und zwar immer aus dem Heap.

Der einzige "kleine" Nachteil gegenüber "volatile": die Synchronisation über volatile ist schneller ...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Thread beenden Allgemeine Java-Themen 9
U Thread beenden Allgemeine Java-Themen 3
B Erkennen, wann Prozess beendet ist, dann Thread beenden. Allgemeine Java-Themen 6
S [THREADS] Thread sinnvoll beenden Allgemeine Java-Themen 2
O Thread beenden egal welcher Zustand? Allgemeine Java-Themen 8
S Thread beenden Allgemeine Java-Themen 50
G Thread nach x Sekunden beenden ... Allgemeine Java-Themen 8
B Thread beenden (von anderer Klasse) Allgemeine Java-Themen 20
S Thread nach Timeout beenden Allgemeine Java-Themen 2
B Thread soll anderen Thread beenden Allgemeine Java-Themen 5
S Thread per GUI Beenden Allgemeine Java-Themen 3
F Thread beenden ? Allgemeine Java-Themen 4
J Thread beenden und wieder starten? Allgemeine Java-Themen 20
R Thread beenden und warten, bis er fertig ist Allgemeine Java-Themen 4
A Wie kann man diesen thread beenden? Allgemeine Java-Themen 17
D Thread & Process: Beenden einer Batch-Datei Allgemeine Java-Themen 8
G Thread beenden Allgemeine Java-Themen 2
conan2 BufferedReader.readLine() von anderem Thread aus beenden Allgemeine Java-Themen 4
D Thread durch Mouse-Event beenden Allgemeine Java-Themen 5
F Thread beenden Allgemeine Java-Themen 5
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
smarterToby Wie stoppe ich diesen Thread Allgemeine Java-Themen 4
A Thread.sleep Problem Allgemeine Java-Themen 2
J Thread started nur einmal Allgemeine Java-Themen 19
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
OnDemand Logfile pro User / Thread Allgemeine Java-Themen 7
OnDemand Thread / Service abbrechen Allgemeine Java-Themen 3
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
B Thread.sleep() in EJB Container wie lösen? Allgemeine Java-Themen 11
S Ist das Neuzuweisen von Feldern atomic und damit Thread-Safe? Allgemeine Java-Themen 2
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
Flynn Thread-Problem... Allgemeine Java-Themen 2
G Thread-Programmierung Allgemeine Java-Themen 5
S Datei wird nicht gefunden Thread.currentThread().getContextClassLoader().getResourceAsStream() Allgemeine Java-Themen 1
G Beendet sich der Thread selbst?! Allgemeine Java-Themen 3
mrbig2017 Sleep wird ignoriert und der Thread wartet nicht Allgemeine Java-Themen 1
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
Aruetiise Swing JOptionPane ohne denn Thread zu pausieren Allgemeine Java-Themen 1
M Nanosekunden-Pause innerhalb einen Thread-Loops Allgemeine Java-Themen 3
E Thread Exception Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
T Merkwürdiges Thread-Verhalten Allgemeine Java-Themen 6
K Thread Problem Allgemeine Java-Themen 6
W Thread sleep 30 sekunden - wenn keine Antwort bis dahin neu senden Allgemeine Java-Themen 2
H Thread bleibt stehen bei jar in jar Allgemeine Java-Themen 1
J Threads HTTP Request (Thread) dauert lange - in Android Allgemeine Java-Themen 3
F CPU Last eines Thread ausfindig machen Allgemeine Java-Themen 0
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
Tausendsassa Threads Einen Thread sich selbst schließen lassen Allgemeine Java-Themen 17
P Threads BufferedImage, Thread Concurrency Allgemeine Java-Themen 1
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
llabusch Thread blockiert Dialog Allgemeine Java-Themen 1
J Thread wait() Allgemeine Java-Themen 2
V Thread.sleep und InterruptedException? Allgemeine Java-Themen 1
G Thread nicht von GC zerstört Allgemeine Java-Themen 6
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
Sogomn Thread blocken bis Taste gedrückt Allgemeine Java-Themen 5
T Starten vom Thread Allgemeine Java-Themen 3
T Wait/Notify() bei Thread Allgemeine Java-Themen 6
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
M Exception in thread "AWT-EventQueue-0" Allgemeine Java-Themen 6
Q Thread wacht nicht auf Allgemeine Java-Themen 7
T Fragen zum Thread-Thema Allgemeine Java-Themen 4
T Threads Input/Output im Thread - Datei ohne Inhalt Allgemeine Java-Themen 1
T Fragen zum Thread-Thema Allgemeine Java-Themen 9
C Threads Variablen in einem Thread Aktualisieren Allgemeine Java-Themen 17
W Threads Mit Thread und Runtime externe Programme öffnen Allgemeine Java-Themen 0
N Thread interrupt Status debuggen Allgemeine Java-Themen 6
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
E Threads linkedlist/multi-thread problem Allgemeine Java-Themen 3
A Thread Fehler absichtlich provozieren Allgemeine Java-Themen 3
B Threads Java Thread kommunizieren Allgemeine Java-Themen 12
N Thread Sicherheit im komplexen Datenmodell Allgemeine Java-Themen 7
K Thread richtig benutzen Allgemeine Java-Themen 3
K Exception in thread "AWT-EventQueue-1" Allgemeine Java-Themen 2
vandread Problem bei kleiner Thread-Übung Allgemeine Java-Themen 2
G Thread erzeugt nicht plausible NullPointerException Allgemeine Java-Themen 7
H Netbeans Warning bei Thread.sleep in Schleife Allgemeine Java-Themen 4
P [Thread] Scheint nicht Sequenziell zu Arbeiten Allgemeine Java-Themen 9
A eine test thread.join() frage Allgemeine Java-Themen 2
tuttle64 Verständnisprobleme mit Thread Locks Allgemeine Java-Themen 4
G Threads Thread bei Datenabfrage Allgemeine Java-Themen 3
S Thread anhalten per Button ? Allgemeine Java-Themen 3
E Thread Programmierung Allgemeine Java-Themen 2
S Threads ServerSocket-Thread soll schlafen, bis er gebraucht wird Allgemeine Java-Themen 2
V Thread schneller stoppen Allgemeine Java-Themen 2
V anstatt thread.join() einfach while schleife? Allgemeine Java-Themen 8
B Mausbewegung im Thread erkennen (hoch/runter) Allgemeine Java-Themen 6
G Linux/C++/Pthreads auf JVM zugreifen, thread safe? Allgemeine Java-Themen 10
K Threads Probleme mit Thread Allgemeine Java-Themen 13
K Threads Thread überprüfen Allgemeine Java-Themen 3
Z Threads Thread für einen Client Allgemeine Java-Themen 9
M Thread JavaFish Allgemeine Java-Themen 10
G Thread.sleep Allgemeine Java-Themen 12
M Threads Viele Aufrufe aus Thread, komisches Verhalten Allgemeine Java-Themen 8
B Threads Main Thread warten auf abgebrochen Task warten lassen Allgemeine Java-Themen 25

Ähnliche Java Themen

Neue Themen


Oben