• Wir präsentieren Dir heute ein Stellenangebot für einen Java Entwickler - m/w/d in Augsburg, München, Stuttgart oder Bamberg. Hier geht es zur Jobanzeige

Thread started nur einmal

J

Joob

Top Contributor
Ich versuche in einem Thread Datensätze zu löschen.
Beim ersten mal läuft alles planmäßig, aber beim zweiten mal startet der Thread gar nicht mehr.
Warum ist das so ?

Aufruf und Thread:
    private void pdm_delete () {
    
        Thread delSelection = new Thread(taskDelSelection);     
        if (delSelection.isAlive()) {
            System.out.println("lebt noch ");
        } else {
            delSelection.start();
        }
        
    }
    

    Task taskDelSelection = new Task<Void>() {
        
        public Void call() {
            
                Platform.runLater(new Runnable() {
                @Override
                public void run() { 
                    hboxdelporgess.setVisible(true);
                    lbdelprogress.setVisible(true);
                    pbdelprogress.setVisible(true);
                    pbdelprogress.setProgress(0);
                }});
                
                ObservableList<PVA00001_DataWordsWithoutSkillTVC> delOLst = FXCollections.observableArrayList();   
                delOLst = tableview.getSelectionModel().getSelectedItems();
                String strid = "";
                final Integer sizeDelOLst = delOLst.size() ;

                for (int i = 0; i < sizeDelOLst; i++) {

                    strid = delOLst.get(i).getId();

                    try {
                        
                        updateProgress( (i + 1) , sizeDelOLst );
                        
                        delWordAndVoice(strid, pvaid);
 
                    } catch (IOException ex) {
                        Logger.getLogger(PVA00001_WordsWithoutSkillController.class.getName()).log(Level.WARNING, ex.toString(), ex);
                    }

                }
                
                tableview.getSelectionModel().clearSelection();
                filltv(start); 
                
                Platform.runLater(new Runnable() {
                @Override
                public void run() { 
                    hboxdelporgess.setVisible(false);
                    lbdelprogress.setVisible(false);
                    pbdelprogress.setVisible(false); 
                }});           
            
            return null;
        };
    };
 
I

ImmerDieseKinder

Mitglied
Hallo, ein Thread kann nur einmal gestartet werden. Sobald er tot ist, ist er tot. Wie im echten Leben auch.
 
J

Joob

Top Contributor
Was soll das bedeuten,
willst du damit sagen das ich einen Thread in einer Klasse nur einmal starten kann.
Das ist doch Unsinn, zumal ich in der Methode immer einen neuen Thread erstelle.

Ich versteh überhaupt nicht was dein Komentar bedeutet.
 
Oneixee5

Oneixee5

Bekanntes Mitglied
Unsinn ist z.B.: das hier:
Java:
       Thread delSelection = new Thread(taskDelSelection);     
        if (delSelection.isAlive()) {
            System.out.println("lebt noch ");
        } else {
            delSelection.start();
        }
Ein Thread der gerade erzeugt und nicht gestartet wurde hat den Status NEW. Thread#isAlive() - Tests if this thread is alive. A thread is alive if it has been started and has not yet died.
 
I

ImmerDieseKinder

Mitglied
Ich glaube sie wollte damit sagen:
Java:
        Thread delSelection = new Thread(taskDelSelection);     
        delSelection.start();
reicht schon
 
J

Joob

Top Contributor
Ja, aber das seltsame ist doch das der Thread einmal ausgeführt wird und dann nicht mehr.

In der Methode pdm_delete erzeuge ich doch immer einen neuen Thread.

Das was ImmerDieseKinder sagt ist schon richtig, die Schleife habe ich zum Testen eingebaut.
Aber eigentlich lenkt das ab.

Was ist die Ursache das ich den Thread nicht noch einmal starten kann ?
Ich hatte heute schon einige Gründe gefunden die in untergeordneten Methoden liegen.
Da wurden Dialogfelder verwendet, das habe ich korrigiert. Ich habe den Task erst gestern eingebaut.

Ich bekomme auch keine Exceptions und ich weiß nicht wie ich den Status des Threads sinnvoll abfragen soll,
aber da ich ja immer einen neuen erstelle ist das vielleicht auch nicht wichtig.

Wenn ich das debugge, geht der Cursor auf delSelection.start() aber der Thread taskDelSelecition
bei der zweiten Verwendung wird nicht ausgeführt, deshalb tippe ich auf einen Fehler in den untergeordneten
Methoden.

Wenn ich ich nur wüsste wo ich suchen muss oder wie ich alle Exceptions angezeigt bekommen,
denn es muss ja offensichtlich einen Fehler geben.
 
J

Joob

Top Contributor
Dadurch das ich bei dieser Methode immer wieder einen neuen Thread starte
sollte das Argument doch nicht gelten.

Einen laufenden Thread will ich ja auch nicht noch einmal starten,
sondern ich erstelle einen neuen und den starte ich.

Oder sehe ich da was falsch ?
 
kneitzel

kneitzel

Top Contributor
Du erstellst immer einen neuen Thread aber in diesem nutzt du immer den gleichen Task.

Und auch der Task kann nur einmal ausgeführt werden (siehe #7)
 
mihe7

mihe7

Top Contributor
Das gibt es viele Möglichkeiten, z. B.
Java:
    private void pdm_delete () {
        Thread delSelection = new Thread(newDeleteSelectionTask());     
        delSelection.start();
    }
    
    private Task<Void> newDeleteSelectionTask() {
        return new Task<Void>() {
            ...
        };
    }
 
J

Joob

Top Contributor
Erst mal schönen Dank für die Hilfe.

Ich habs jetzt, funktional OK,
aber das Binding bekomme ich nicht mehr hin.
Geht das nicht mehr weil ich immer einen neuen Task erzeuge und damit ein Binding nicht vorher möglich ist `?


Java:
    private void pdm_delete () {
    
        
          Thread delSelection = new Thread( taskDelSelection()); 
//          pbdelprogress.progressProperty().bind(taskDelSelection.progressProperty());

          delSelection.start();
        
    }
    

    private Task<Void> taskDelSelection () {
        
        return new Task<Void>() {
            
            protected Void call() {
                
                Platform.runLater(new Runnable() {
                @Override
                public void run() { 
                    hboxdelporgess.setVisible(true);
                    lbdelprogress.setVisible(true);
                    pbdelprogress.setVisible(true);
                }});
                
                ObservableList<PVA00001_DataWordsWithoutSkillTVC> delOLst = FXCollections.observableArrayList();   
                delOLst = tableview.getSelectionModel().getSelectedItems();
                String strid = "";
                final Integer sizeDelOLst = delOLst.size() ;

                for (int i = 0; i < sizeDelOLst; i++) {

                    strid = delOLst.get(i).getId();

                    try {
                        
                        Integer state = i;
                        Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            pbdelprogress.setProgress((double) (state + 1) / sizeDelOLst);
                        }} );
//                        updateProgress( (i + 1) , sizeDelOLst );
                        
                        delWordAndVoice(strid, pvaid);
 
                    } catch (IOException ex) {
                        Logger.getLogger(PVA00001_WordsWithoutSkillController.class.getName()).log(Level.WARNING, ex.toString(), ex);
                    }

                }
                
                Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    
                    hboxdelporgess.setVisible(false);
                    lbdelprogress.setVisible(false);
                    pbdelprogress.setVisible(false);
                    
                    tableview.getSelectionModel().clearSelection();
                    filltv(start); 
                }} );
                        
            return null;

        }};
    }
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Nicht böse gemeint, aber: der Code ist grausam, das grenzt ja schon an Missbrauch.

Abgesehen davon solltest dir potentiell noch mal die Doku zu Task angucken, wie du es aktuell nutzt geht das völlig an der sinnvollen Nutzung vorbei.

Ich kann dir gleich ein Beispiel liefern, was aber gut zu wissen wäre ist, was delWordAndVoice macht?
 
J

Joob

Top Contributor
delWordAndVoice löscht einen Eintrag in der Datenbank und einige Datei die damit in Zusammenhang stehen.
Das Löschen der Dateien nimmt Zeit in Anspruch, so das ich eine Meldung über den Fortschritt anzeigen wollte.
Darum habe ich den Teil in einen Thread gelegt. Leider bin ich dabei zum ersten mal auf den Umstand gestoßen
das man einen Task in einer Klasse nur einmal starten kann, ich hatte gedacht wenn ich einen neuen Thread
erzeuge, läuft der Code paralell so das ich in der GUI den Status anzeigen kann.

Ich bin ja froh über deine ehrliche Meinung, aber was genau ist daran so furchtbar.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Ich bin ja froh über deine ehrliche Meinung, aber was genau ist daran so furchtbar.
z.B: der Stil bei Benennung von Variablen: pdm_delete, delOLst & hboxdelporgess.

Dann sowas hier:
Java:
ObservableList<PVA00001_DataWordsWithoutSkillTVC> delOLst = FXCollections.observableArrayList();   
delOLst = tableview.getSelectionModel().getSelectedItems();
Die erste Zuweisung ist Unsinn, da sie direkt in der nächsten Zeile überschrieben wird.

Java:
final Integer sizeDelOLst = delOLst.size() ;
Integer nur, wenn explizit null erlaubt ist (oder Generics genutzt werden)

Java:
String strid = "";
...
 for (...) {
    strid = ...
Sowohl die vorzeitige Deklaration als auch die vorzeitige Initialisierung sollte man vermeiden.



Und dann sind da halt potentielle Fehler drin: delOLst sollte potentiell nicht direkt auf das SelectionModel verweisen, sondern eine Kopie der Liste erstellen. Ansonsten lässt sich der Inhalt der Liste ändern, während die Funktion läuft, was dann IndexOutOfBounds zur Folge hat oder Elemente ignoriert.
 
J

Joob

Top Contributor
Danke für deine Hinweise, das hat mir weitergeholfen.
Ich bin jedoch froh das ich (nur) diese Fehler gemacht habe.

Einige der Fehler sind entstanden weil das mein erstes JavaProjekt ist und es immer wieder überarbeite um eben
was vernünftiges daraus zu machen.

Das mit den Variablen ist mir noch nicht so ganz klar, aber ich glaube ich weiß worauf du hinauswillst.
Ich finde es gut wenn man am Anfang einer Methode weiß welche Variablen verwendet werden,
darum habe ich diese erst einmal voriniatilisiert.

Wenn Du sagst das macht man nicht so, dann denke ich das ich die Variablen in der Methode
in einem Komentar am Anfang beschreiben soll. Lieg ich da richtig oder hab ich das ganz falsch verstanden.

Die Sache mit dem Integer / int, super endlich mal eine handfeste Regel zur Verwendung.

Das andere ist klar, kommt aus der Geschichte, versuch auch ständig auszumerzen.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Das mit den Variablen ist mir noch nicht so ganz klar, aber ich glaube ich weiß worauf du hinauswillst.
Ich finde es gut wenn man am Anfang einer Methode weiß welche Variablen verwendet werden,
darum habe ich diese erst einmal voriniatilisiert.

Wenn Du sagst das macht man nicht so, dann denke ich das ich die Variablen in der Methode
in einem Komentar am Anfang beschreiben soll. Lieg ich da richtig oder hab ich das ganz falsch verstanden.
Variablen alle am Anfang der Methode angeben (oder auch beschreiben) ist meistens nur Quelle für Verwirrung und Fehler und gleichzeitig ohne irgendwelche Vorteile.

Verwirrung, weil da plötzlich irgendeine Variable mit einem unsinnigen Wert auftaucht, die die nächsten Zeilen erstmal nicht benutzt wird.

Fehler, weil der Scope unnötig groß, und dann zB auf falsche Werte oder an falschen Stellen darauf zugegriffen werden kann. Deine Schleife startet zB erstmal immer mit dem "alten" Wert für strid (bevor der überschrieben wird), und vor und nach der Schleife hat strid auch einen Wert, obwohl der dort nicht benutzt werden darf bzw ungültig ist.

Keine Vorteile, da damit nur Deklaration und Verwendung auseinander gezogen wird (eigentlich will man ja das Gegenteil, zusammengehörende Dinge näher zusammen), man somit mehr Code überblicken muss, und gleichzeitig das Wissen 'In der Methode XY wird irgendwo in den nächsten 50 Zeilen die Variable z benutzt, aber keine Ahnung wozu und ob der zugewiesene Wert "" überhaupt eine Rolle spielt'.

Was würdest du denn mit der Information "In der Methode wird irgendwann mal eine String-Variable namens strid benutzt" anfangen wollen?

In deinem Fall ist es btw auch gar nicht "am Anfang der Methode", sondern mittendrin, und es geht um grade mal zwei Zeilen Unterscheid zu einem sinnvollen Scope
 
J

Joob

Top Contributor
Schönen Dank das Du Dir die Mühe gemacht hast.
Das muss ich mir mal durch den Kopf gehen lassen.
Ich schau mir mal einige Methoden an.
Ich würde mich noch mal melden, ich bin gerade dabei einiges umzustellen.

Aber was nett wäre, kannst du meine Konstruktion des Threads kurz kritisieren, ich will
nicht zu viel verlangen, aber ein zwei Stichpunkte auf die ich das noch mal untersuchen sollte wären cool.

Schönen Dank
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Etwa so ließe sich das umsetzen:

Java:
private void start() {
        Task<Void> t = taskDelSelection();
        new Thread(t).start();
    }

    private Task<Void> taskDelSelection() {

        return new Task<Void>() {

            @Override
            protected void scheduled() {
                pbdelprogress.progressProperty().bind(this.progressProperty());
                pbdelprogress.setVisible(true);
            }

            @Override
            protected void succeeded() {
                pbdelprogress.setVisible(false);
                pbdelprogress.progressProperty().unbind();
                tableview.getSelectionModel().clearSelection();
                filltv(start);
            }

            protected Void call() throws InterruptedException {
                //Kopie der Liste erstellen, um gleichzeitige Nutzung deer Liste in zwei Threads zu vermeiden
                List<PVA00001_DataWordsWithoutSkillTVC> delOLst = delOLst = List.copyOf(tableview.getSelectionModel().getSelectedItems());
                final int sizeDelOLst = delOLst.size();
                this.updateProgress(0, sizeDelOLst);

                for (int i = 0; i < sizeDelOLst; i++) {
                    try {
                        String strid = delOLst.get(i).getId();
                        delWordAndVoice(strid, pvaid);
                        this.updateProgress(i + 1, sizeDelOLst);
                    } catch (Exception ex) {
                        Logger.getLogger(App.class.getName()).log(Level.WARNING, ex.getMessage(), ex);
                    }
                }
                return null;
            }
        };
    }
 
J

Joob

Top Contributor
Wow, da steckt ne Menge drin.
Das nehme ich mir am Wochenende vor.

und das muss ich mal sagen, ich finde das super wie Du und mihe7 und kneizel sich um die Fragen kümmern.
Großer Respekt.

Ihr habt mir schon so oft weiter geholfen. Schönen Dank !!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
NicoDeluxe Logfile pro User / Thread Allgemeine Java-Themen 7
NicoDeluxe 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
S Thread beenden Allgemeine Java-Themen 9
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
U Thread beenden Allgemeine Java-Themen 3
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
B Erkennen, wann Prozess beendet ist, dann Thread beenden. Allgemeine Java-Themen 6
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
K Timer Thread Allgemeine Java-Themen 8
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
C Mehothode in anderenm Thread aufrufen Allgemeine Java-Themen 10
R Thread läuft nicht?! Allgemeine Java-Themen 7
R ThreadPool - vorhandene thread liste überprüfen bzw. aufräumen Allgemeine Java-Themen 3
J Anderem Thread Variable mitgeben Allgemeine Java-Themen 2
C Argument an einen Thread übergeben Allgemeine Java-Themen 4
S java.util.ConcurrentModificationException - aber nur ein Thread Allgemeine Java-Themen 3
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
P Java Probleme - java.lang.Thread.run(Unkown Source) Allgemeine Java-Themen 10
L Im Thread auf Eingaben warten Allgemeine Java-Themen 3
P aus Thread auf Form zugreifen Allgemeine Java-Themen 9
C Threads Thread blockieren Allgemeine Java-Themen 4
K Threads Thread für Sleep Allgemeine Java-Themen 6
H Threads Thread stirbt aber Objekte in ihm leben weiter?! Allgemeine Java-Themen 9
K Threads Thread aktualisiert Progressbar nicht Allgemeine Java-Themen 4
D Methoden Thread Schleife Status Allgemeine Java-Themen 7
T Thread Warteschlange Allgemeine Java-Themen 21
D Thread-Array (richtig) überwachen Allgemeine Java-Themen 3
X Threads Thread mehrmals verwenden Allgemeine Java-Themen 4
X Button während Thread aktiv ist disablen Allgemeine Java-Themen 11

Ähnliche Java Themen

Anzeige

Neue Themen


Oben