
文章插图
线程池的 7 大参数整理 。
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)corePoolSize 线程池中长期存活的线程数ThreadPoolExecutor 在创建之初,是不会立即初始化corePoolSize数量的Thread的,而是通过外部request来一个一个的创建,当达到corePoolSize数目之后,就会维持至少corePoolSize数目的Thread在pool中,哪怕他们都处于空闲状态(idle) 。corePoolSize >= 0 。maximumPoolSize 线程池中的最大线程数量maximumPoolSize >= corePoolSize , maximumPoolSize>0
- 若当前线程池中线程数 < corePoolSize,则每来一个任务就创建一个线程去执行 。
- 若当前线程池中线程数 >= corePoolSize,会尝试将任务添加到任务队列 。如果添加成功,则任务会等待空闲线程将其取出并执行(针对的是有界队列) 。
- 若队列已满 , 且当前线程池中线程数 < maximumPoolSize,创建新的线程 。
- 若当前线程池中线程数 >= maximumPoolSize,则会采用拒绝策略 。
销毁的线程数=maximumPoolSize(最大线程数)-corePoolSize(核心线程数) 。
TimeUnit 时间单位空闲线程存活时间的描述单位,有以下选项:
- TimeUnit.DAYS:天
- TimeUnit.HOURS:小时
- TimeUnit.MINUTES:分
- TimeUnit.SECONDS:秒
- TimeUnit.MILLISECONDS:毫秒
- TimeUnit.MICROSECONDS:微妙
- TimeUnit.NANOSECONDS:纳秒
- LinkedBlockingQueue:用链表实现的队列,可以是有界的 , 也可以是无界的,但在Executors中默认使用无界的 。当有新的任务来到时 , 若系统的线程数小于corePoolSize,线程池会创建新的线程执行任务, 当系统的线程数量等于corePoolSize后,因为是无界的任务队列,总是能成功将任务添加到任务队列中,所以线程数量不再增加 。若任务创建的速度远大于任务处理的速度,无界队列会快速增长,直到内存耗尽 。
- SynchronousQueue:一个不存储元素的阻塞队列,SynchronousQueue没有容量,所以实际上提交的任务不会被添加到任务队列,总是将新任务提交给线程执行,如果没有空闲的线程,则尝试创建新的线程,如果线程数量已经达到最大值(maximumPoolSize),则执行拒绝策略 。
- ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列 。
- PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列 。
- DelayQueue:一个使用优先级队列实现的无界阻塞队列,只有在延迟期满时才能从中提取元素 。
- LinkedTransferQueue:一个由链表结构组成的无界阻塞队列 。与SynchronousQueue类似,还含有非阻塞方法 。
- LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列 。
import JAVA.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadFactory;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class Test {public static void mAIn(String[] args) {// 创建线程工厂ThreadFactory threadFactory = new ThreadFactory() {@Overridepublic Thread newThread(Runnable runnable) {// 创建线程池中的线程Thread thread = new Thread(runnable);// 设置线程名称thread.setName("Thread-" + runnable.hashCode());// 设置线程优先级(最大值:10)thread.setPriority(Thread.MAX_PRIORITY);//......return thread;}};// 创建线程池ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,10,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(10),threadFactory);try{threadPoolExecutor.submit(new Runnable() {@Overridepublic void run() {Thread thread = Thread.currentThread();System.out.println(String.format("线程:%s,线程优先级:%d",thread.getName(), thread.getPriority()));}});}catch (Exception e) {} finally {threadPoolExecutor.shutdown();}}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- GitHub CEO:AI无法取代程序员
- 程序员的15个“坏习惯”,你踩过几个坑?
- 编程速度与质量的较量:程序员如何取得平衡?
- 作为程序员,我们不能只管上线,不管线上!
- 为什么说35岁是程序员的分水岭
- 我,程序员,在华为工作,告诉你年收入有30万吗?生存压力大吗?
- 哪些错误是经验不足的程序员会犯的
- 从建筑师到程序员,我的五年游戏引擎开发之路
- 技术转管理,程序员如何进行自救?
- 三层软件架构导致程序员负担翻倍?
