一、什么是线程池?
线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。
如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
二、为什么使用线程池?
创建线程和销毁线程的花销是比较大的,这些时间有可能比处理业务的时间还要长。这样频繁的创建线程和销毁线程,再加上业务工作线程,消耗系统资源的时间,可能导致系统资源不足。(我们可以把创建和销毁的线程的过程去掉)
三、线程池工作原理
1、当线程池中有任务需要执行时,线程池会判断如果线程数量没有超过核心数量就会新建线程进行任务执行
2、如果线程池中的线程数量已经超过核心线程数,这时候任务就会被放入任务队列中排队等待执行
3、如果任务队列超过最大队列数,并且线程池没有达到最大线程数,就会新建线程来执行任务;
4、如果超过了最大线程数,就会执行拒绝执行策略
总结:提交顺序:核心线程池 > 队列 > 非核心线程池 执行顺序:核心线程池 > 非核心线程池 > 队列
四、线程池有哪些?
线程池参数:corePoolSize(核心线程数)、maximumPoolSize(最大线程数)、keepAliveTime(存活时间)、util(时间单位)、workQueue(队列)、threadFactory(创建线程的线程工厂)、handler(拒绝策略)
1、newSingleThreadExecutor(单线程化的线程池)
new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>())
描述:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
使用场景:用于串行执行任务的场景,每个任务必须按顺序执行,不需要并发执行。
2、newFixe