线程属于系统的宝贵资源,频繁的创建和销毁线程,会降低效率,所以需要使用线程池

Java开发中百分之99都是单线程开发,但是一单用到多线程,肯定是用到线程池.

有两种使用方法

方法一:使用Executors工具类的两个静态方法来创建,很简单,直接类型.方法名就可以,但是不推荐.ali的开发手册就明确规定了禁止使用Executors工具类的静态方法来创建.要求使用自定义线程池的方法来使用

方法二:创建自定义线程池

首先看要搞明白线程池的参数

JDK中ThreadPoolExecutor类:可以创建线程池对象,但构造方法参数太多,接下来我们就来认识一下都有哪些参数:

第一个参数 int corePoolSize : 核心线程数

线程任务会分为两种:

(1)IO密集型(用于读取/写入文件) = 当前机器的核心数 * 2

(2)CPU密集型(运算) = 当前机器的核心数 + 1

当前机器核心数=电脑CPU的内核,可以通过 任务管理器->性能 查看

java mysql 线程池设置 java 线程池配置_阻塞队列

第二个参数 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线程

第一次写博客,看过的家人们劳烦给个点赞支持一下哦!