Threading / Callables

Hello,

I have something like the following:
Java:
do {
...
            final IReadTransaction mRTX = session.beginReadTransaction();
            final Parser parser = new Parser(mRTX);
            final Future<Picture> futPic = tp.submit(parser);
            futPics.add(futPic);
} while(...)

within Parser.class I have the implemented the call method like I have to (because Parser extends Callable<Picture>):

public Picture call() {
...
}

but Somehow it never gets called which is very strange I think :-/

Ohje völlig verwirrt, ausnahmsweise ja mal in einem deutschen Forum ;-)

regards,
Johannes
 
Zuletzt bearbeitet:
Hm, also Picture ist nur ein Container indem ich dann irgendwelche sachen per Setter speichere und die read transaction ist zwecks dem auslausen von XML aus einem nativen XML Datenbanksystem.

und der Parser soll halt an verschiedenen Stellen in der (geshredderten) XML-Datei parsen...

Java:
public final class Parser implements Callable<Picture> {
...
public Picture call() {
...
}
}

Das Problem ist halt, dass der intern irgendwelche Sachen macht sobald tp.submit(parser); aufgerufen wird, aber letztendlich call() nicht aufgerufen wird.

Vielleicht ist der ExecutorService noch wichtig:

Java:
        // Initialize ExecutorService.
        //        final Runtime runtime = Runtime.getRuntime();
        //        final int processors = runtime.availableProcessors();
        final ExecutorService tp = Executors.newFixedThreadPool(10);

Viele Grüße,
Johannes
 

ThreadPool

Bekanntes Mitglied
Hello,
Java:
do {
...
            final IReadTransaction mRTX = session.beginReadTransaction();
            final Parser parser = new Parser(mRTX);
            final Future<Picture> futPic = tp.submit(parser);
            futPics.add(futPic);
} while(...)

Ich hoffe du rufst auf den Futures noch irgendwann mal get auf (Bsp. futPic.get()) um die Ergebnisse abzuholen. Und bist du dir ganz sicher das "call" nicht aufgerufen wird? Hast du mal ein System.out.println() am Anfang in den Call gepackt? Wenn es wirklich so sein sollte das call nicht aufgerufen wird dann wirst du wohl oder übel mehr Code herzeigen müssen.
 
Zuletzt bearbeitet:
Richtig dämlich:

System.out.println("called");
// Move cursor to longitude element.
if (!(mRTX.moveToFirstChild() && mRTX.moveToRightSibling())) {
throw new IllegalStateException("Moving inside parser failed!");
}

Zunächst hatte ich den sysout nach dem Check und irgendwie wirft er die Exception dann nicht sondern macht irgendwas intern im ExecutorService...

Aber wie kann ich denn die Exceptions die innerhalb des Threads auftreten auch werfen lassen, ohne dass der die abfängt und dann irgendwo in einer Schleife stecken bleibt?

Später hole ich die Pictures aus den Future-Objekte dann natürlich raus und hänge sie an eine ArrayList an.

Viele Grüße,
Johannes
 

ThreadPool

Bekanntes Mitglied
Richtig dämlich:

Zunächst hatte ich den sysout nach dem Check und irgendwie wirft er die Exception dann nicht sondern macht irgendwas intern im ExecutorService...

Hm, da wär ich mir nicht so sicher. Dein Task wird mit einer Exception beendet, dein Print-Statement dann nicht mehr ausgegeben. Da du den Task mit submit eingestellt hast, gehören die Exceptions zum Future der dann wenn du mit get das Ergebnis abholen möchtest die Exception gepackt in eine ExecutionException zurückgibt.

Probier beim anschließenden durchlaufen deiner Pic liste mal den Aufruf von get in einen try/catch Block auf eine ExecutionException zu packen und lass dir mal einen Stacktrace ausgeben wenn sie fliegt, das sollte dann der abgeschmierte Task sein.
 
Ok, zugegenermaßen habe ich nichtmal in die Log-Datei geschaut:

Java:
        // Add pictures to pictures list.
        for (final Future<Picture> future : futPics) {
          Picture picture = null;
          try {
            picture = future.get();
          } catch (ExecutionException e) {
            logger.warn("Exception exception: " + e.getMessage(), e);
          }
          pictures.add(picture);
        }

Hast du eventuell ne Idee zu meinem nächsten Problem?
 

ThreadPool

Bekanntes Mitglied
Java:
        // Add pictures to pictures list.
        for (Future<Picture> future : futPics) {
           try {
            Picture picture = future.get();
            pictures.add(picture);
          } catch (ExecutionException e) {
            logger.warn("Exception exception: " + e.getCause(), e);
          }
        }

Beschreib mal dein Problem ;).
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben