大致和你说的差不多,线程池在其中线程数小于corePoolSize的时候会直接把thread和runnable对象一起包装成一个Worker,然后调用runWorker方法启动线程,一般称这个过程为预热。当他的任务执行完成后会去阻塞队列里取待完成任务,就是调用getTask方法:
while (task != null || (task = getTask()) != null) { }
至于这个线程啥时候被回收就看你的keepAliveTime参数配置了。