1.newCachedThreadPool创建一个可缓存的线程池。线程创建数量没有限制,线程可以灵活回收。如果线程空闲时间设置为1分钟,工作线程将自动终止。终止后当有新的任务提交时,会重新建立一个新的线程。缺点是在使用CachedThreadPool时一定要注意控制任务数量,否则由于大量线程同时运行,很可能造成系统瘫痪。核心线程数为0,非核心线程数为MAX_VALUE,队列不存值,一直认为队列已满,所以每次执行任务时,都会有一个非核心线程创建。如果非核心线程空闲时间超过60秒(默认),会自动回收。2.newfixedThreadPool创建一个定长线程池。在达到长度之前,将为每个提交的任务创建一个线程。如果达到最大线程池数,就会提交到队列中,线程空闲时不会自动回收。核心线程数是参数传入,非核心线程数与核心线程数相同,队列为无界队列。当资源有限时,很容易造成OOM。与newSingledThreadPool不同的是核心线程数不是1.3。newSingledThreadPool创建一个单线程执行。只有一个线程顺序执行任务,如果这个线程异常结束,另一个线程会接管并顺序执行任务。corepoolsize核心线程数为1,非核心线程数为1,队列为无界队列。单工作线程最大的特点是可以保证每一个任务按顺序执行,并且在任何给定的时间都不会有超过一个线程处于活动状态。4、newScheduedThreadPool创建一个定长线程池,并支持定时、周期任务执行,支持定时、周期任务执行。如果延迟3秒执行或者每3秒执行一次,则设置核心线程数为参数,非核心线程数为MAX_VALUE。定义了一个DelayedWorkQueue,它是一个有序队列,每个任务都会按照下次执行的时间间隔执行。线程池执行逻辑说明:判断核心线程数是否已满,核心线程数的大小与corePoolSize参数有关,如果核心线程池已满,判断队列是否满,队列是否已满full和workQueue参数相关。如果队列未满,则将其添加到队列中。如果队列已满,则判断线程池是否已满。线程池是否满与maximumPoolSize参数有关。如果未满,则创建线程执行任务。处理无法执行的任务,拒绝策略和拒绝策略相关的handler参数rejectionpolicy=>默认采用AbortPolicy拒绝策略,直接在程序中抛出RejectedExecutionException【因为是运行时异常,不强制catch],这种处理方式不够优雅。处理拒绝策略有几种建议:在程序中捕获RejectedExecutionException异常,在捕获异常的同时处理任务。默认拒绝策略使用CallerRunsPolicy拒绝策略。这种策略会将任务交给调用execute的线程[一般是主线程]。这时主线程会在一段时间内无法提交任何任务,让工作线程处理执行。任务。此时提交的线程会保存在TCP队列中,TCP队列满了会影响客户端。这是一种温和的性能降低自定义拒绝策略,只需要实现RejectedExecutionHandler接口即可。如果任务不是特别重要,使用DiscardPolicy和DiscardOldestPolicy拒绝策略丢弃任务也是可以的
