2. Übung

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

2. Übung
Es ist ein bisschen spät für die zweite Übung, aber ich habe trotzdem eine Frage:
HalloExecutor lässt sich kompilieren und ausführen. Aber:
Wenn man einigermassen die Klasse mit solche Aufrufe brutalisiert: java HalloExecutor 3000, dann bleibt das Programm nach HalloThread-2999! stehen, also der Pool wird nicht mehr geschloßen, der Kursor blinkt da alleine und grün und der Prozessor steigt auf 135%.
Auch wenn man den Code so ändert:

if (!e.awaitTermination(10, TimeUnit.SECONDS)) e.shutdownNow() ;

ändert sich nichts.


Das ist klassisches verhungern.
Alle 3000 Threads greifen regelmässig auf das interne lock des ExecutorServices zu, um nachzufragen, ob sie sich beenden sollen.
Da hat der eine Hauptthread, der mitteilen will das jetzt schluss ist, schlechte Chancen, zumal das lock aus performance gründen nicht “fair” ist, sondern einen beliebigen thread aufweckt.

Wenn man lange genug wartet, beendet sich das Programm auch bei 3000 Threads auf meinem Dual-Core. Ein ExecutorService ist eher dafür gedacht viel arbeit mit wenigen Threads (nahe an der Kernanzahl) abzuarbeiten als viele Threads zu verwalten, die meistens nix tun ausser zu pollen. :slight_smile: