线程属于系统的宝贵资源,频繁的创建和销毁线程,会降低效率,所以需要使用线程池
Java开发中百分之99都是单线程开发,但是一单用到多线程,肯定是用到线程池.
有两种使用方法
方法一:使用Executors工具类的两个静态方法来创建,很简单,直接类型.方法名就可以,但是不推荐.ali的开发手册就明确规定了禁止使用Executors工具类的静态方法来创建.要求使用自定义线程池的方法来使用
方法二:创建自定义线程池
首先看要搞明白线程池的参数
JDK中ThreadPoolExecutor类:可以创建线程池对象,但构造方法参数太多,接下来我们就来认识一下都有哪些参数:
第一个参数 int corePoolSize : 核心线程数
线程任务会分为两种:
(1)IO密集型(用于读取/写入文件) = 当前机器的核心数 * 2
(2)CPU密集型(运算) = 当前机器的核心数 + 1
当前机器核心数=电脑CPU的内核,可以通过 任务管理器->性能 查看
第二个参数 int maximumPoolSize : 最大线程数
核心线程数 + 临时线程数 = 最大线程数 比如核心:12 最大:20 临时:3
第三个参数 long keepAliveTime : 临时线程最大存活时间(这是一个数值,并没有单位)
第四个参数 TimeUnit unit : 临时线程最大存活时间(这个是单位) 枚举 (用法:枚举类名.枚举项名)
第五个参数 BlockingQueue<Runnable> workQueue : 阻塞队列(用于存储还没有执行的线程任务)
分为有界和无界两种
(1)有界阻塞队列(规定队列的长度) ArrayBlockingQueue 构造方法指定长度
(2)无界阻塞队列(不规定队列的长度) LinkedBlockingQueue
第六个参数 ThreadFactory threadFactory : 线程工厂
有固定的写法 Thread::NEW 或者 Executors.defaultThreadFactory()
第七个参数 RejectedExecutionHandler handler : 默认拒绝处理策略(当线程任务数量超过了最大线程数+阻塞队列长度时才会起作用)
有四种处理方式
静态内部类的创建方式:new 外部类名.内部类名();
(1)AbortPolicy : 一旦无法处理,直接抛出异常.
(2)DiscardPolicy : 一旦无法处理,不抛异常(把多余的任务丢弃掉)
(3)DiscardOldestPolicy : 一旦无法处理,用无法处理的任务替换阻塞队列中等待时间最长的任务.
(4)CallerRunsPolicy : 将无法处理的任务,绕过线程池,让当前线程执行,比如main线程
第一次写博客,看过的家人们劳烦给个点赞支持一下哦!