Java线程池
文章来自 shichang // Welcome!
主页
|
About Me
|
归档
|
标签
### 手动new Thread的缺点: * 线程无法重用,需要频繁的新建和销毁 * 线程缺乏统一管理,线程数量有可能爆炸 * 不能对线程的执行进行计划 ### 使用线程池的优点: * 控制程序中工作线程的最大数量,提高资源的利用效率 * 可以提供定时、定期、等执行控制 * 可以重复利用线程资源,减少线程的建立和销毁次数 ### Java中有五种线程池 * FixdThreadPool:固定线程池中的最大线程数量,超过阈值的线程放入工作队列中处理 * CachedThreadPool:核心线程数为0,线程池容量为最大整数值,首先使用已经创建的进入空闲的线程,没有空闲线程则新建。 * SingleThreadPool:只使用一个线程来执行任务,保证任务按照给定的顺序执行 * ScheduledThreadPool:创建一个定长的线程池,支持定时和周期性执行任务 * workStealThreadPool:非线程执行器构造,线程池中的线程会在自己的任务完成后从其他线程中抢夺任务进行执行。 ### 线程池的原理 以上四种线程池都是基于线程池执行器进行构造的 ```java public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runable> workQueue, ThreadFactory threadFactory, Handler handler){ } ``` 线程池执行器的构造方法有7个参数,根据七个参数进行不同构造得出不同功能的线程池。第一个参数corePoolSize表示核心线程数量,第二个参数maximumPoolSize表示最大线程数量, keepAliveTime表示空闲线程的存活时间,TimeUnit表示空闲线程存货时间的单位,workQueue表示线程工作队列,threadFactory表示线程来源,handler表示线程池满时的拒绝策略。 `线程池执行器的工作原理`:线程池新建后,开始有任务接入,新建线程处理任务,当线程数量小于corePoolSize时,始终新建线程来处理任务。线程数量开始超过corePoolSize时,将新的任务加入到工作队列中,当核心线程有空闲时就处理工作队列中的任务。当工作队列满时,新建普通线程进行任务处理,当所有线程数量等于maximumPoolSize时,线程池满了,不能再接受更多的任务,接下来接收到的任务都会使用handler进行拒绝处理。  ### 拒绝策略 Java自带的拒绝策略有四种: * 直接丢弃(DiscardPolicy) * 丢弃队列中最老的任务(DisCardOldestPolicy) * 抛出异常(AbsortPolicy) * 使用调用线程分担任务(CallerRunsPoicy) 策略内容与名称一样,四种策略相互独立,异常是抛出Runtime Exception,抛异常会中断调用线程。 >pool.setRejectExceutionHandler(new ThreadExceutor.***Policy()); 参考[线程池](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html)
Pre:
Java内存模型JMM
Next:
ThoughtWorks面试