"echter" SingleThreadExecutor

bluttraum

Grünschnabel
Hallo,

Ich habe das Problem, dass ich einen ExecutorService brauche, der mir immer einen Thread nach dem anderen (in hinzugefügter Reihenfolge) abarbeitet. Jedoch darf erst ein anderer Thread drankommen, wenn der jetzige vollständig abgeschlossen wurde (ob erfolgreich oder durch eine Exception), nicht aber, wenn er nur schläft.

Wollte es zuerst so probieren:
Java:
Executors.newSingleThreadExecutor();

Dieser ExecutorService nimmt jedoch auch einen anderen Thread an die Reihe, wenn jetziger nur schläft.

Gibt es eine andere Möglichkeit, dies zu machen? Habe auch schon an eine einfache Queue gedacht, jedoch müsste ich hier mit Listenern arbeiten, bzw. die Queue kontinuierlich abfragen, ob ein neuer Thread da ist, oder?

Ich hoffe ich bin überhaupt im richtigen Forum ^^

lg
Manuel
 
Hallo,

so wie Du es beschreibst, ist der Ansatz mit der Queue schon der Richtige.

Du könntest einen Thread basteln, in dessen run()-Methode die Queue abgearbeitet
wird. Über einen add-Methode könnte man nach FIFO-Manier Objekte hinzufügen,
die aus Kompatibilitätsgründen der Einfachheit halber auch Runnable-Implementiern.

Der Thread nimmt sich aus der Queue ein Objekt nach dem anderen heraus,
und ruft run() auf. So ist sichergestellt das nur dieser eine Thread läuft !

Sollte die Queue mal leer sein, kann der Thread ja mal kurz schlafen und auf neue
Objekte warten. Blöd ist nur wenn eines der Objekte mist baut, die run()-Methode
nicht verlässt oder den Thread zum abschmieren bringt.
Evtl. hilft da eine Art WatchDog zu programmieren.

Gruß JAdix
 
Hat so schon ganz gut funktioniert, danke!

Könnt ihr mir mal vereinfacht die Vorteile eines ThreadPools erklären, den man mit Executors.newSingle/Cached/FixedThreadExecutor(); hat? In der Java-Insel und in der API steht jeweils, dass vorhandene Threads wieder verwendet werden. Wie darf ich das verstehen? Wird der Thread dann auch schneller ausgeführt, wenn ganz andere Parameter dafür verwendet werden?

lg
Manuel
 
Zurück