Every concurrent request gets its own thread, whereas this seems to be one thread per core.
Also, the servlet API is crazy, partly because of all its baggage. There seems to be a lot of exploration around what the right API is right now, but its pretty clear the world wants something new.
There's really no conflict between the statement, "every request gets it's own thread" and the use of thread pools.
The point is that a given request in a servlet container is handled in it's own thread. That thread will probably come from a pool and be reused to handle another request of course, but that's sort of immaterial.