ThreadPool - vorhandene thread liste überprüfen bzw. aufräumen

redbomber

Bekanntes Mitglied
Hi zusammen,
ich habe eine Frage wie ich folgende Punkte bei mir korrekt implementieren soll:

Ich habe einen ThreadPool, bei dem ich einen minCount und maxCount (minimale/maximale Anzahl Threads) angeben kann.

1. Initialiserung:
Wie soll der Pool initialisiert werden? Soll ich im Konstruktor direkt die minimale Anzahl an Thread initialisieren? Oder warte ich bis die Anfragen kommen.

2. Threads aufräumen:
Jeder Worker-Thread in meinem Thread-Pool kann ausgeliehen werden und wird dann als used markiert.
Mein Thread-Pool hat nun einen CleanerThread, welcher zyklisch die Liste aller vorhandenen Threads prüft.
Hier prüfe ich:
- Ist thread noch ok? falls nein dann lösche Thread
- Ist thread noch ausgeliehen und ist ein Timeout aufgetreten? falls ja dann lösche Thread
Danach habe ich meine Liste "aufgeräumt" und enthält nur noch funktionierende Worker-Threads.
Was mache ich jetzt? Soll ich wieder soviele Worker-Threads initialiieren bis die minimale Anzahl an Threads erricht ist?

hier mal meine Aufräum-Methode welche in einem separatem CleanerThread abläuft:
Java:
private Vector<WorkerThread>        workerThreads;

private synchronized void cleanupConnections() {
      if (cleanupThread.isClosing()) {
         return;
      }
      long lTimeOut = System.currentTimeMillis() - UNUSED_TIMEOUT;

      Enumeration<WorkerThread> availableThreads= workerThreads.elements();

      while ((availableThreads!= null) && (availableThreads.hasMoreElements())) {
         WorkerThread oneWorkerThread= (WorkerThread) availableThreads.nextElement();
// lösche alle threads bei denen es einen Fehler gab
         if ((oneWorkerThread.isError())) {
            workerThreads.remove(oneWorkerThread);
            continue;
         }
// lösche alle threads bei denen es einen Timout gab
         if ((workerThreads.inUse()) && (lTimeOut > workerThreads.getLastUse())) {
            workerThreads.remove(oneWorkerThread);
            continue;
         }
      }
// ab hier könnte die Liste der vorhanden WorkerThreads leer sein. Soll ich jetzt die minimale Anzahl an Threads initialisieren?
   }
 
Zuletzt bearbeitet:
wie soll dir dazu jemand was beantworten?
ob du die Threads schon vorher initialisierst hängt z.B. davon ab ob dir dazu später die Zeit fehlt, was in Java eigentlich kaum Sinn ergibt,

wenn schon, ist eher zu vermuten dass ein unnötig initialisierter Thread minimal das System belastet,
lasse das sein, erstelle sie nur wenn nötig

was eine "minimale Anzahl Threads" bei den ganzen zu bedeuten hat ist natürlich auch wieder fraglich,
wenn das schon ganz am Anfang in den Spezifikationen verdrahtet ist, sollten vielleicht wirklich Threads laufen,
oder eben "minimale Anzahl Threads" mit entfernen..

edit:
einen 'kaputten' Thread zu entfernen ist auch relativ fraglich,
ich weiß nicht wie offizielle ThreadPools das machen, aber in einem solchen Fall könnte der Pool auch komplett auf Error gehen,
höchstens noch andere Threads beenden, und der User soll dann mal was machen, z.B. neuen Pool anlegen
 
Zuletzt bearbeitet von einem Moderator:
hey, vielen Dank euch erst einmal für die Antworten.
@SlaterB, du hast Recht. So ist das nicht zu beantworten und so habe ich es für mich selbst definiert was für mich die beste Art der Initialisierung ist:

1. Anzahl-Threads< minThreadCount: erstelle neuen Thread
2. Anzahl-Threads>= minThreadCount && Anzahl-Threads< maxThreadCount: gebe freien Thread zurück bzw. erstelle neuen wenn maxThreadCount noch nicht erreicht
3. Wenn alle Threads belegt und maxThreadCount erreicht, muss ich irgendwie warten (bin ich noch dran)

@turtle:
Danke! Da sehe ich auch wie ich vielleicht mein aktuelles Problem mit dem 3. Punkt bei der Initialisierung lösen kann. Ich denke ich muss die Aufgaben irgendwie in eine Queue einreihen...

@SlaterB:
Noch zu dem aufräumen der Threads:
Bei mir bedeutet ein error() bei meinem WorkerThread, dass z.B. eine Verbindung abgebrochen ist.
Daher denke ich dass ich bei mir diese Strategie verwenden kann. D.h. meine WorkerThreads die keine "Verbindung" mehr haben, beende ich einfach (die würden mir ja auch nichts mehr bringen).
 

Neue Themen


Zurück
Oben