春招修仙系列 —— 线程池

概述:

在Java中,可以利用Executor来创建线程池,线程池可以帮助我们更好的去管理线程,避免频繁开启关闭线程所带来的性能损耗

ExecutorService threadPool = Executor.newCachedThreadPool();

Java中提供的线程池

1 newCachedThreadPool

带有缓存功能的线程池,适用于处理大量短时间工作的线程,它会缓存线程并重用,当无缓存线程的时候,就会新键工作线程,如果线程闲置超过60s,则被终止并移除缓存,即使在长时间闲置,这种线程池也不会消耗什么资源。

2 newFixedThreadPool

固定大小的线程池,在任何时候最多有n个工作线程是活动的,有工作线程退出时,将会有新的工作线程被创建。

3 newSingleThreadExecutor

工作线程的数目被限制为1,所有的任务按顺序执行,最多只会有一个线程处于工作状态

4 newScheduleThreadPool

可以进行周期性的工作调度

5 newWorkStealingPool

基于work-stealing算法,并行处理任务,会根据当前处理器的参数,确定开启的线程数量,但是不保证按顺序返回

线程池参数

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

corePoolSize: 核心线程数,内存中存在多少线程。

maximumPoolSize:最大线程数,在内存中最多存在多少线程

keepAliveTime:空闲线程的存活时间

TimeUnit:时间单位

BlockingQueue: 线程池使用的缓冲队列,存放等待执行的线程

注:常用的BlockingQueue:
ArrayBlockingQueue:
是一个由数组实现的有界阻塞队列,必须设定容量
LinkedBlockingQueue:
是一个由链表实现的有界队列,容量可以选择设置,如果不设置的话,将是一个无边界阻塞队列,最大长度为 Integer.MAX_VALUE
PriorityBlockingQueue:
具有优先级的阻塞队列

threadFactoy:创建线程池使用的工厂,通过工厂,我们可以给每个新建的线程,提供一个具有识别度的线程名,便于问题的排查

handler 线程池的饱和策略,当线程池满了,如果想要继续提交任务,必须采取一种策略处理该任务,线程池提供了4种策略

1 默认策略,直接抛出异常
2 用调用者的线程来执行该任务
3 移除线程池阻塞队列中最靠前的任务,执行当前任务
4 直接丢弃任务。

猜你喜欢

转载自blog.csdn.net/Kirito19970409/article/details/86566483
今日推荐