Java线程池高级应用有哪些技巧?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2005个文字,预计阅读时间需要9分钟。
线程池是日常开发中常用的技术,使用简单,但设计合理。开发者需不断探索底层实现原理,以便在不同场景下选择合适的策略,最大化发挥性能。
线程池是日常开发中常用的技术,使用也非常简单,不过想使用好线程池也不是件容易的事,开发者需要不断探索底层的实现原理,才能在不同的场景中选择合适的策略,最大程度发挥线程池的作用以及避免踩坑。
一、线程池工作流程以下是Java线程池的工作流程,涉及创建线程的参数及拒绝策略,如果读者对这部分内容不太了解,可参考其他的文档,本文不在赘述。
二、线程池进阶 1、线程池的创建需要手动通过ThreadPoolExecutor创建,使用者要非常明确业务场景并定制线程池,避免误用可能导致的问题。
以下是阿里巴巴Java开发手册中的描述:
ThreadFactory:推荐使用guava中的ThreadFactoryBuilder创建:
new ThreadFactoryBuilder().setNameFormat("name-%d").build();
2、阻塞队列在线程池中的使用
很多同学一看到阻塞队列就自然的认为出入队列都是阻塞的,使用的阻塞队列也就没必要关心拒绝策略了,其实不然,阻塞队列在任务提交和任务获取阶段使用了不同的策略。
任务提交阶段:调用的阻塞队列的offer方法,这个方法是非阻塞的,如果插入队列失败会直接返回false,并触发拒绝策略;
获取任务阶段:使用的是take方法,此方法是阻塞的;
3、保证提交阶段任务不丢失有三种方法:使用CallerRunsPolicy拒绝策略、自定义拒绝策略、使用MQ系统保证任务不丢失。
本文共计2005个文字,预计阅读时间需要9分钟。
线程池是日常开发中常用的技术,使用简单,但设计合理。开发者需不断探索底层实现原理,以便在不同场景下选择合适的策略,最大化发挥性能。
线程池是日常开发中常用的技术,使用也非常简单,不过想使用好线程池也不是件容易的事,开发者需要不断探索底层的实现原理,才能在不同的场景中选择合适的策略,最大程度发挥线程池的作用以及避免踩坑。
一、线程池工作流程以下是Java线程池的工作流程,涉及创建线程的参数及拒绝策略,如果读者对这部分内容不太了解,可参考其他的文档,本文不在赘述。
二、线程池进阶 1、线程池的创建需要手动通过ThreadPoolExecutor创建,使用者要非常明确业务场景并定制线程池,避免误用可能导致的问题。
以下是阿里巴巴Java开发手册中的描述:
ThreadFactory:推荐使用guava中的ThreadFactoryBuilder创建:
new ThreadFactoryBuilder().setNameFormat("name-%d").build();
2、阻塞队列在线程池中的使用
很多同学一看到阻塞队列就自然的认为出入队列都是阻塞的,使用的阻塞队列也就没必要关心拒绝策略了,其实不然,阻塞队列在任务提交和任务获取阶段使用了不同的策略。
任务提交阶段:调用的阻塞队列的offer方法,这个方法是非阻塞的,如果插入队列失败会直接返回false,并触发拒绝策略;
获取任务阶段:使用的是take方法,此方法是阻塞的;
3、保证提交阶段任务不丢失有三种方法:使用CallerRunsPolicy拒绝策略、自定义拒绝策略、使用MQ系统保证任务不丢失。

