1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Java Thread .stop()

Discussion in 'Programmieren' started by bastelhamster1, Jun 5, 2009.

Thread Status:
Not open for further replies.
  1. Hallo,
    ich habe da mal eine frage zu Threads unter Java.
    Und zwar möchte ich in genannten Thread eine Datenbankabfrage
    packen. Läuft auch bei mir so wie ich es will.

    Aber natürlich kann es ja mal vorkommen, dass sich die DB bei der
    Abfrage "Aufhängt" oder die Abfrage selber.

    Einen Thread kann man bzw. könnte man ja mit .stop() beenden.

    Gibt es da eventuell etwas besseres ???
     
  2. kazhar

    kazhar Viertel Gigabyte

    ich nehme an du willst darauf hinaus, dass dein programm das "aufhängen" erkennt und den datenbank-abfrage-thread abschießt (mit thread.stop())

    ich löse das so, indem ich gefährdeten threads einen "guard" verpasse, der sie nach einer maximalen zeit oder nachdem das "ich lebe noch"-signal ausbleibt, beendet und neu startet bzw die (nicht erfolgten) ausgaben repariert.
     
  3. daboom

    daboom Megabyte

    stop() ist schon lange deprecated und sollte deswegen auch nicht verwendet werden.

    An Deine Stelle würde ich einfach eine Mischung aus interrupt() (Um den Thread aus der blockierenden Abfrage rauszuholen) und irgendeinem boolean Flag, das in einer while Schleife abgefragt wird.

    Beispiel:

    Code:
    public class DBThread extends Thread {
      private boolean isRunning = true;
    
      @Override
      run() {
        while (isRunning) {
          try {
            // Blockierende Datenbankabfrage (Darum auch InterruptedException)
          } catch (final InterruptedException e) {
            e.printStackTrace()
          }
        }
      }
    
      public void stopRunning() {
        isRunning = false;
        interrupt();
      }
    };
    
    // Dann irgendwo eine Instanz von DBThread anlegen
    final DBThread t = new DBThread();
    t.start();
    
    // Und dann irgendwo, wo Du merkst, das Murks passiert:
    
    t.stopRunning();
    
    Eine Alternative wäre es noch, den Thread als Daemon laufen zu lassen. Dann beendet er automatisch, wenn es keine Nicht-Daemon Thread mehr gibt.
     
  4. danke dir,
    ich probiere das mal aus...
     
  5. X-Stream

    X-Stream Byte

    Die Frage ist, wird die Datenbankabfrage abgebrochen? bei interrupt()?

    Hast du schon mal ausprobiert, was überhaupt passiert wenn die Datenbank hängt?
    Ich könnte mir vorstellen, dass die Abfrage nach einer bestimmten Zeit ohne Antwort von der Datenbank eh per Exception endet.
    Ich habe jetzt nicht viel gesucht; es gibt auf jeden Fall die Möglichkeit, einen DB Login-Timeout zu definieren; per "static DriverManager.setLoginTimeout(int seconds)".
     
  6. daboom

    daboom Megabyte

    Das kommt zumindest in dem Beispiel darauf an, was der Thread gerade macht. Wenn er sich gerade in einem wait() befindet (innerhalb der Datenbankabfrage) wird die abgebrochen und die InterruptedException geworfen.

    Ansonsten passiert gar nix.

    Wenn das interrupt() durch den stopRunning()-Aufruf ausgelöst wird (und das boolean Flag noch umgesetzt wird) wird sich der Thread natürlich beenden. ;)
     
Thread Status:
Not open for further replies.

Share This Page