线程池
参数:(随意搭配,符合当前业务):corePoolSize:核心线程数量,在空闲时不会被回收。
maximumPoolSIze:可以容纳的最大线程数量。
keepAliveTime:除核心线程外其他线程可以保留的最长空闲时间。
util:可保留最长空闲时间单位
workQueue:等待队列,任务可以存储在任务队列中等待被执行。
threadFactory:创建线程的线程工厂。
handler:拒绝策略,一般开发中使用自定义拒绝策略。
分类:创建方式Executors
newCachedThreadPool:线程数最大值Integer.MAX_valuie;
当线程池中没有可用线程,会新建线程。
线程池中的线程可进行缓存重复利用和回收。(回收默认时间一分钟)。
newFixedThreadPool:创建固定线程数,队列无界。
newSingleThreadExecutor:创建一个线程数,最多执行一个线程,队列无界。
newScheduleThreadPool:创建一个线程池,可安排给定延迟后运行命令或者定期执行。
newSingleThreadScheduledExecutor:创建单线程执行程序,可安排给定延迟后运行命令或者定期执行。
Excutors创建线程池弊端:
FixedThreadPool和SingleThreadPool:允许等待队列长度为Integer.MAX_value,可能会堆积大量请求,导致OOM。
CachedThreadPool:允许创建线程数最大为Integer.MAX_value,可能会创建大量线程,导致OOM。
阿里不允许这样创建,建议通过ThreadPoolExecutor方式房间,可让开发者更明确线程池的运行规则,规避资源耗尽。
执行逻辑:
概念:是一种多线程处理形式,在处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以看作一个容器,集中管理线程。线程使用完不会被销毁,会先储存在线程池中。
五种状态:
running:处在running状态时,能够接收新任务,以及对已添加的任务进行处理。
线程池初始化状态就是running,也就是一旦被创建,就处于running状态,并且线程池中任务数为0。
shutdown:线程池处在shutdown状态时,不接收新任务,但能处理已添加的任务。
调用shutdown()接口时,线程池由running -> shutdown。
stop:线程池处在stop状态时,不接收新任务,不处理已添加的任务,并且会中断正在处理的任务。
调用线程池的shutdownNow()接口时,线程池由running或shotdown -> stop。
tidying:当所有任务都停止,ctl记录的“任务数量”为0,线程池会变为tidying状态。
当线程池在shutdown下,阻塞队列为空并且线程池中执行的任务也为空时,就会由shutdown -> tidying。
当线程池中在stop状态下,线程池中执行的任务为空时,就会由stop -> tidying。
terminated:线程池彻底终止,就会变成Terminated状态。
线程池处在tidying状态时,执行完terminated(),就会由tidying -> terminated。
作用:重用线程池中的线程,减少每个线程的创建和销毁的性能开销;
对线程进行维护管理,比如定时开始,并发数控制。
原理:
阻塞队列分类:
ArrayBlockingQueue: 基于数组的队列,先进先出。因为生产者放入数据,消费者获取数据都用同一个锁,所以无法并行。
LinkedBlockingQueue:基于链表,先进先出,吞吐量高于ArrayBlockingQueue。
SynchronousQueue:不存储元素的队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量高于LinkedBlockingQueue。无缓冲区,放一条取一条,成对出现。
PriorityBlockingQueue:一个可设置优先级的无限阻塞队列。

初始化线程池核心线程数的选择:
查看机器的CPU核数,再设定;
CPU核数 = Runtime.getRuntime().availableProcessors()
分析线程池处理的程序是IO密集还是CPU密集:
CPU密集型:核心线程数 = CPU核数 + 1
IO密集型:核心线程数 = CPU核数 * 2
拒绝策略:当请求任务不断的过来,而系统此时又处理不过来的时候,我们需要采取的策
应用:异步:接收到请求,放入线程池。支付,拒绝策略:放入mq。游戏,角色移动位置,发送数据,旧的位置没用,可以直接扔掉
执行方式:execute:同步,无返回值。
submit:异步,有返回值。方便处理Exception,也就是捕获Future.get的异常。
浙公网安备 33010602011771号