本文从几个角度讨论了ThreadPoolExecutor,供大家参考。内容概要几个重要的参数;线程如何实现重用?空闲线程存活时间如何控制?参数解释常用构造函数:publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueueworkQueue);下面是一个简单的例子corePoolSize:线程池的核心线程数;maximumPoolSize:线程池中最大线程数,现有线程数;需要注意的是,即使有空闲线程,只要线程数不超过corePoolSize,新任务还是会用新线程执行。任务的执行速度和BlockingQueue的容量都会影响实际的线程数。如果任务执行的很快,队列不会满,实际线程数也很难达到maxPoolSize;如果任务处理慢,队列容量固定,当加入大量任务时,队列很快就会满,这时就需要增加线程来处理,直到总数达到maxPoolSize。如果有更多任务到达,将触发拒绝处理程序。线程重用线程池中的线程是如何实现一个任务执行完后,继续执行下一个任务的呢?-循环。要继续了解详细机制,还需要了解Worker。Worker实现了Runnable接口,复用的奥秘在于worker的run方法://选择关键代码finalvoidrunWorker(Workerw){Runnabletask=w.firstTask;while(task!=null||(task=getTask())!=null){task.run();可以看出runWorker方法通过getTask(来自BlockQueue)不断获取任务进行处理,实现了一个线程处理多个任务!在构造一个Worker的时候,会同时创建一个新的Thread并绑定到它上面。绑定伪代码如下:newThread(worker)在addWorker某处,会调用thread.start方法,worker开始工作。有关详细信息,请参阅addWorker方法。空闲线程的消亡keepAliveTime决定了空闲线程能活多久。getTask方法是一种阻塞方法。如果队列为空,getTask进入阻塞状态,如果等待时间超过keepAliveTime且没有新的任务,则返回null,上面的while循环结束,执行worker.run方法,也就是说该线程结束并将从线程池中移除。总结随着任务的增加,线程数先达到corePoolSize,然后新的任务加入到队列中。如果队列已满,则继续添加线程,直到maxPoolSize;线程池的线程复用是通过循环+队列实现的。空闲线程等待keepAliveTime后如果还没有收到任务就会被回收。