Java并发编程线程池-new ThreadPoolExecutor(参数解读)
ExecutorService pool new ThreadPoolExecutor(2, 4, 6, TimeUnit.SECONDS, new ArrayBlockingQueue(2), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());以上创建了一个ThreadPoolExecutor线程池对象它是Java 并发编程中最核心的类之一。其中的参数解读如下1. 核心与最大任务处理能力corePoolSize 2核心线程数。这是线程池的“常驻员工”即便没活干这 2 个人也会留着。maximumPoolSize 4最大线程数。如果活太多队列满了线程池会临时扩招最多招到 4 个人。2. 空闲处理机制keepAliveTime 6unit TimeUnit.SECONDS如果非核心线程那 2 个扩招的临时工在 6 秒内没有接到新任务就会被裁掉以节省资源。3. 工作排队区域new ArrayBlockingQueue(2)任务缓存区。如果核心的 2 个人都在忙排好队的新任务会放在队列里等。这个队列最多放 2 个任务。4. 线程创建工厂Executors.defaultThreadFactory()这就是一个“招聘负责人”负责给线程取名字、设置优先级等用的是默认的招聘标准。5. 拒绝策略最关键的部分new ThreadPoolExecutor.AbortPolicy()这是默认的拒绝策略。含义如果 4 个人都在忙且队列里的 2 个位子也满了再有新任务进来线程池会直接抛出RejectedExecutionException异常不再处理这个新任务。一句话总结流程工作逻辑当任务来临时它是这样被处理的先找常驻员工核心 2 人能处理就处理。常驻员工满了去排队如果队列没满还能放 2 个就在那里等着。队列满了找临时工去扩招临时工直到总人数达到 4 人。都满了拒绝任务如果 4 个人都在忙队列也没位子了触发AbortPolicy直接抛出异常拒绝接受新任务。为什么这样做这种设计是为了资源保护。如果不设置这些限制比如队列无限大、线程无限多在高并发下程序可能会因为创建过多的线程导致内存溢出OOM或者因为大量的等待任务拖垮整个系统。形象比喻这就像一个只有 2 个固定柜台的银行大厅里有 2 把椅子队列。最多一共开 4 个窗口最大线程数。如果有人进门先去柜台柜台满了去椅子上坐着等椅子也坐满了再开临时窗口。如果临时窗口也满了大厅也站不下了经理只能对着进门的第 7 个人喊“抱歉今天不办了请回吧”这就是AbortPolicy。这段代码适合在对系统实时性要求较高、且不允许任务无限制堆积的场景下使用。