线程池笔记

线程池创建

Executors.**newFixedThreadPool(int)**一池N线程,控制最大的并发数,超出的线程会在队列中等待

Executors.**newSingleThreadExecutor()**一池一线程

Executors.**newCachedThreadPool()**一池可扩容根据需求创建线程,可灵活回收空闲线程
执行完线程,可不用再扩建继续使用

Executors.newScheduledThreadPool(),支持定时及周期性任务执行

核心参数
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) 
  1. corePoolSize:线程池中常驻核心线程数
  2. maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于1
  3. keepAliveTime:多余空闲线程的存活时间。当前线程池数量超过corePoolSize时,当空闲时间达到keepAliveTime时,多余空闲线程会被销毁直到剩下corePoolSize为止。
  4. unit:keepAliveTime的单位
  5. workQueue:里面放了被提交但是尚未执行的任务,当池子里的工作线程数大于corePoolSize时,这时新进来的任务会被放到队列中
  6. threadFactory:表示线程池中工作线程的线程工厂,用于创建线程
  7. handler:拒绝策略,当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时,对任务的拒绝方式。
workqueue
1.ArrayBlockQueue

(基于数组的有界队列,FIFO)

2.LinkedBlockQueue

(基于链表的无界阻塞队列,Integer.MAX FIFO)Tips:此时maximunPoolSize参数没用

3.SynchronousBlockQueue

(不缓存任务队列)没有容量,进去一个元素必须等待取出来后才能往里面放一个元素。

4.PriorityBlockQueue

(优先级队列)(基于Comparator实现 比较 无界 阻塞队列)

拒绝策略
1.CallerRunsPolicy

不进入线程池执行,在这种方式(CallerRunsPolicy)中,任务将由调用者线程去执行。

2.AbortPolicy

当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。

(该策略下,直接丢弃任务,并抛出RejectedExecutionException异常)

3.DiscardPolicy

当任务添加到线程池中被拒绝时,默认情况下它将丢弃被拒绝的任务。(即该策略下,直接丢弃任务,什么都不做)

4.DiscardOldestPolicy

当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。

(该策略下,抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列)

你可能感兴趣的:(java)