线程池就是就是池化思想的产物。打个比方,筷子,你吃饭的时候都是去筷子桶去拿,而不是每一次都去买新的筷子。在你第一次吃饭的时候已经买了筷子,所以你后续就不用在去买新的筷子,节省了你去超市的时间和买筷子的钱。
线程池的参数都有哪些呢?
1.核心线程数。
2.最大线程数。
3.空闲时间。
4.时间单位。
5.任务队列。
6.拒绝策略。
7.线程工厂。
当我们提交一个任务的时候,线程池会查看核心线程数是不是已经饱和,如果不是的话就执行该任务。如果已经饱和的话就查看任务队列是否已满,如果未满则进入等待队列。如果满的话会查看最大线程数是否饱和,如果饱和的话会执行拒绝策略,如果未饱和,会创建线程执行任务。
1.如果当前工作线程小于核心线程的话,会优先创建一个线程去执行任务,而不是去等待获取一个空闲线程。
2.如果线程池中的任务总数大于核心线程,新加入的任务会加入到任务队列中,直到队列饱和。
3.当一个任务执行完之后,执行器会优先从队列中获取,并且开始执行,直到队列为空。
4.在核心线程饱和并且队列也满的情况下,线程池中的线程小于最大线程数,线程池会创建一个新线程执行任务。
5.在核心线程数饱和,队列已满,线程池中的线程数超出最大线程数就会执行拒绝策略。
阻塞队列
1.ArrayBlockingQueue: 是一个数组实现的有界队列,队列中的元素按照FIFO排序,ArrayBlockingQueue在创建时必须设置大小。
2.LinkedBlockingQuere: 是一个列表实现的队列,元素按照FIFO排序,可以设置容量,默认容量为Integer.Max_Value。
3.PriorityBlockingQueue: 是具有优先级的无界队列。
拒绝策略
1.AbortPolicy: 拒绝策略,新任务会被拒绝,并且抛出RejectedExecutionException异常,默认的拒绝策略。
2.DiscardPolicy: 新任务会被抛弃,并且不会抛出异常。
3.DiscardOldPolicy: 抛弃最老的任务,再次尝试进入队列。
4.CallerRunsPolicy: 调用者策略,如果新任务添加失败,那么提交任务的线程自己去执行该任务,不会使用线程池中的线程执行该任务。