We need this semaphore to block when the number of running workitems
is equal to the number of threads. FixedThreadPool limits the number
of threads, but not the queue size. This way we will limit the memory
usage.