线程池的七个参数由来

40 阅读2分钟

java 线程模型是一对一的 ,一个 java 线程对应操作系统的内核级线程

创建一个 java 线程,就需要操作系统切换到内核态去创建内核级线程

这就涉及到内存的分配,栈空间的分配

同样的,销毁线程也需要系统切换到内核态去回收这些资源

所以 java 中创建和销毁线程的代价非常大

为了避免频繁地创建和销毁线程,可以先把线程创建出来,放在一个容器里统一管理,这就是线程池

一般情况下,线程池的线程也就几个几十个,但是要处理的任务有上百上千个,线程处理不完的任务怎么办?这个时候就需要阻塞队列,把未完成的任务放在阻塞队列中,当线程处理完手头上的任务,从阻塞队列中拿回这些任务,继续进行处理

阻塞队列的大小是有上限的,阻塞队列满了怎么办?队列满了说明任务很多,说明当前压力很大,需要临时创建一些临时线程来紧急处理。

如果队列中的任务处理完了,临时线程也空闲了,就该销毁了,所以需要设置临时线程的最大空闲时间,超过这个时间之后就要销毁

如果队列满了,临时线程也在忙,仍然有新任务来了,这个时候就要定义一套拒绝策略来拒绝这些任务

该如何统一给线程命名→需要一个线程工厂。

当一个任务被提交到线程池,核心线程空闲,交给核心线程执行

否则尝试放进阻塞队列,

否则创建临时线程

否则执行拒绝策略

不想执行拒绝策略:CallerRunPolicy,谁往线程池提交任务,谁就去执行这个任务,让业务线程执行任务拖垮效率。

自定义拒绝策略:把需要拒绝的任务存储到 redis 中或者 mq 中,重写线程池 afterExecute 方法,当线程池执行完任务后,判断一下阻塞队列的大小,读取 redis 或者 mq 中的持久化的任务,丢到阻塞队列里进行处理。这样就能实现不丢弃任务。