need to wrap the thread pool in a sized to guard against the problem that the
JDK created thread pool has an unbounded queue (see class javadoc), which mean
we could potentially keep adding tasks, and run out of memory.