多线程
线程池的创建
- new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
- corePoolSize 线程池的核心线程数,即使是空闲的;除非allowCoreThreadTimeOut被设置
- maximumPoolSize 线程池中线程最大数量
- keepAliveTime 超过corePoolSize数量的线程最大空闲时间
- TimeUnit 上一个参数keepAliveTime的时间单位
- workQueue 任务执行之前,保存经由execute方法提交的任务
- ThreadFactory 创建新线程的工厂
- RejectedExecutionHandler 当线程和队列满了后的拒绝策略
- Executors.newFixedThreadPool 队列LinkedBlockingQueue长度为最大Integer
- Executors.newCachedThreadPool 线程池线程最大数量为Integer的最大数,队列为SynchronousQueue
execute的处理流程
- 工作线程小于核心线程数量,添加任务执行
- 工作线程大于等于核心线程数时,新的任务添加到队列
- 工作线程等于最大线程数且任务队列满时,新的任务走RejectedExecutionHandler
RejectedExecutionHandler 拒绝策略
- ThreadPoolExecutor.AbortPolicy 抛出RejectedExecutionException异常;默认的处理策略
- ThreadPoolExecutor.DiscardPolicy 不做处理,抛弃
- ThreadPoolExecutor.DiscardOldestPolicy 抛弃队列头部,重新调用 ThreadPoolExecutor.execute(runnable)
- ThreadPoolExecutor.CallerRunsPolicy 调用者线程执行
线程池使用场景
- CPU密集型:coreSize=maxSize=cpu.availableProcessors cpu的核心数量,一般是长队列
- IO密集型:特点线程数设置大,队列长度短或SynchronousQueue
- NIO等的编码压榨普及,也会压缩此种场景至第一种