DefaultThreadFactory.newThread() creates a new thread with a name, but then calls renameThread().
This effectively names the thread twice, which is means the cost of thread creation is higher than it should be (naming involves calling SecurityManager.checkAccess().
SOLUTION:
Prepare the name before creating the thread and then pass the name to the constructor.