1、多线程七大参数:
corePoolSize核心线程数(正式员工),
maximumPoolSize(正式员工和可调度的外包员工的总合)
keepAliveTime非核心线程数的存活时间
unit非核心线程数的存活时间单位
workQueue任务队列
threadFactory 线程工厂
RejectedExecutionHandler 拒绝策略
多线程中有两种类型的线程干活,核心线程和非核心线程,核心线程数相当于正式员工,非核心线程相当于外包员工,最大线程数=正式员工和可调度的外包员工的总合,正式员工够用的时候只有他们干活,如果不够用(队列满了)时,会调用外包员工干活(创建非核心线程),如果可调用的外包员工还不够用了,则执行拒绝策略(自己根据业务定义)。正式员工默认一直存活(除非被开除),外包员工按设置的存活时间,干完活到期就自动走人。
2、Concurrent包下提供了excutors类,该类提供多种线程泄创建方法:
1. newCachedThreadPool(ThreadFactory threadFactory) 速度快,不建议使用,因为它的最大线程数是integer.max_value. 即非核心线程数最多可以是integer最大值,可以理解为有任务进来,会一直开启非核心新线程(即有多少任务就开多少线程),线程太多会占用cpu,消耗硬件性能,导致cpu100%,拖慢系统,直接体现就是系统会越来越慢。
2.newFixedThreadPool(int nThreads)速度慢,
3. newSingleThreadExecutor(ThreadFactory threadFactory)速度最慢,只有一个核心线程数,也没有非核心线程数,且队列是无界队列。
不建议使用2,3是因为它使用的是无界队列,每个任务进来都会创建一个任务节点,这就涉及到内存,如果有1千万个任务进来,就要创建1000个任务节点来存储新进来的task,队列一直扩容会导到oom
3、提交优先级和执行优先级不同
提交优先级:核心线程>任务队列>非核心线程
核心线程>非核心线程>任务队列
submit 和 execute区别
1)submit有返回值,execute没有返回值
2)两者的本质是一样的都是 执行线程