...wenn zu schnell versucht wird, die Tasks aufzurufen bevor die Arbeit gemacht ist, dann kommen immer mehr Threads dazu...
Eigentlich schreibst du doch genau in diesem Satz, was das Problem ist.
Wieso verhinderst du nicht, das neue Threads gestartet werden, wenn noch andere laufen bzw. die mit ihrer Arbeit noch nicht fertig sind?
Ist ja logisch, das sich das dann gegenseitig immer mehr aufbaut (stark vereinfacht):
Thread 1 gestartet
Prozessoren bearbeiten 1 Thread
Thread 1 noch nicht fertig, aber nächster wird gestartet.
Prozessoren bearbeiten 2 Threads
Thread 1 und 2 noch nicht fertig, aber nächster wird gestartet.
Prozessoren bearbeiten 3 Threads
...
ggf. wird zwischendurch mal ein Thread fertig aber wenn der 1. Thread schon nicht fertig wird, bevor der zweite startet, wie sollen zwei Threads da fertig werden bevor der dritte startet usw.?
Richtig wäre:
...
Thread 1 gestartet
Prozessoren bearbeiten 1 Thread
Ein neuer Thread soll gestartet werden aber Thread 1 noch nicht fertig, daher noch keinen weiteren starten.
Prozessoren bearbeiten 1 Thread
Thread 1 fertig, nun kann der nächste gestartet werden.
Prozessoren bearbeiten 1 Thread
...