Thread Problem

Kababär

Top Contributor
Hi,

ich starte einen Thread, sobald auf einen Button geklickt wird, damit die GUI nicht einfriert.
Und zwar circa so:
Code:
 private void startNormalTransformTask() {
        Task task = new Task<Void>() {

            @Override
            public Void call() throws Exception {
                
                XmlToObject.start(Mod);

                Platform.runLater(() -> {
                    //Gui updaten
                    }

                   
                    });
                    //Gui updaten wenn fertig

                });
                updateMessage("Finished");
                return null;
            }
        };
        Thread th = new Thread(task);
        th.setDaemon(true);
        th.start();
    }

In XmlToObject rufe ich einen JAXB auf und lese eine XML-Datei ein und hantiere nun mit diesen Objekten. Dabei habe ich mir eine Helper-Klasse geschrieben, die eine Methode "getEnts" enthält, um gewisse Zahlen aus den Attributen der Objekte zu holen.
In XmlToObject starte ich eine Methode in einer anderen Klasse "Wrtier", die nun für verschiedene Aufgaben die Zahlen rausholen soll (pro Aufgabe eine Methode und anschließend Textdateien erstellen soll). Es werden keine weiteren Threads genutzt. Die Methode aus der Helperklasse zum Auslesen der Zahlen wird bisher einmal in der Writer-Klasse benutzt.
Es hat alles funktioniert bis ich meinen Code so ergänzte, dass die Methode "getEnts" der Helperklasse nun ein zweites Mal, in einer anderen Methode in der Writer Klasse aufgerufen wird.
Der Code wird nicht mehr ausgeführt, die GUI befindet sich im Leerlauf.
Es wird auch kein Fehlercode ausgespuckt also ab in den Debugger und ich komme, sobald es an die Methode "getEnts" geht, in die Task.java-Klasse bzw. genauer

Code:
private static final class TaskCallable<V> implements Callable<V> {

}

Und dort lande ich im catch-Zweig.
Wieso kann ich die Methode einmal aufrufen, aber kein zweites Mal?
So einfach verständliche, detaillierte Literatur im Netz konnte ich bis jetzt noch nicht finden.
Kann mir jemand helfen?
 
Der Code ist nichts spektakuläres und funktioniert vorher auch. Um vielleicht doch etwas mehr Übersicht über mein Programm zu erhalten:

Writer
Code:
public void extractLimits(){

    limitDVD();
    limitBooks();
    limitGames();
    ....
}

Aufruf von getEnts in Writer
Code:
                                int[] iaMinMax = Helper.getEnts(o.getV());
                                int min = iaMinMax[0];
                                int max = iaMinMax[1];
                                if (min != 0) {
                                    min = min - 1;
                                }
                                if (max != 999) {
                                    max = max - 1;
                                }
Wobei o das aktuell betrachtete Node ist (DVD, Book, Game, ...) und im Attribut V steht dann beispielsweise so etwas wie "Das Spiel ist erst ab 18 Jahren".
Die Methode rufe ich in limitDVD() auf, da funktioniert es. Als ich die Methode dann noch in limitGames() aufgerufen habe, springt er direkt in die Callable Klasse von Task.java in den Catch-Zweig.

Helper
Code:
    public static int[] getEnts(String input) {

        int[] res;

        if (input == null || input.isEmpty()) {
            return null;
        }

        String tmp, minTmp, maxTmp;
        int minIndex, maxIndex, tLength;

        int min, max;

        tLength = input.length();
        //Hat der Text eine beginnende Angabe wie ab, von, zwischen für das Mindestalter?
        //von 7. bis 8...
        //ab 17 Jahre...
        //zwischen 19 und 21 Jahre..
        if (input.contains("ab") || input.contains("von") || input.contains("zwischen")) {
            if (input.contains("ab")) {
                minIndex = input.indexOf("ab");
            } else if (input.contains("von")) {
                minIndex = input.indexOf("von");
            } else {
                minIndex = input.indexOf("zwischen");
            }

        } else {
            minIndex = 0;
        }

        //Hat der Text eine endende Angabe für das Höchstalter?
        //... bis 18 Jahre
        //von 19 bis 21 Jahre...
        if (input.contains("bis")) {
            maxIndex = input.indexOf("bis");
        } else {
            maxIndex = input.length();
        }

        //Relevanter Textteil extrahieren und verarbeiten
        tmp = input.substring(minIndex, tLength);

        minTmp = input.substring(minIndex, maxIndex);
        maxTmp = input.substring(maxIndex, tLength);

        if (containsNumber(minTmp)) {
            min = Integer.valueOf(minTmp.replaceAll("[^0-9]", ""));

        } else {
            min = 0;
        }
        if (containsNumber(maxTmp)) {

            max = Integer.valueOf(maxTmp.replaceAll("[^0-9]", ""));

        } else {
            max = 999;
        }

        res = new int[]{min, max};

        return res;
    }
 
Ja ich bin mir da sicher. Aber mittlerweile bin ich mir auch schon relativ sicher, dass es wohl nicht an dem Thread liegt, sondern eher irgendwo anders. Da jeder Thread quasi seine eigenen Models hat etc sind sie also gut separiert und sollten sich nicht in die Quere kommen.
Ich kommentiere mal eben den Thread aus und gucke, ob es dann immer noch Probleme gibt (hätte ich auch früher drauf kommen können).
 
Die Methode wird nur von einem Thread aufgerufen, keine Sorge. Meine GUI hat mehrere Buttons, mit denen man Prozesse starten kann, die unabhängig voneinander sind. Während ein Prozess am Laufen ist, werden die anderen "Start"buttons aber deaktivert, zur Sicherheit.
Die anderen Threads kommen erst gar nicht in die Nähe dieser Methode.
Aber ich glaube ich habe den Fehler gefunden...
Callable wurf eine Exception aus, weil die Methode einen ungültigen Parameter hatte.
 

Neue Themen


Zurück
Oben