Java线程池的实现原理及其在业务中的最佳实践
8 个线程池最佳实践和坑!
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
重要经验:
1)不要在代码中使用局部变量定义线程池对象,这样不仅会导致频繁创建线程池对象,违背了线程复用的设计原则,还有可能造成局部变量的线程池对象无法及时垃圾回收的内存泄漏问题;
2)业务代码中,优先定义静态内部类而不是非静态内部类,可以有效防止内存泄露的风险;
3)相互依赖的子任务避免使用同一线程池,至于为什么可以看这篇文章会有更深刻的理解:https://mp.weixin.qq.com/s/ZiXd_4N1xssC69UoOZNLIg
4) 合理选择submit()和execute()方法
execute(Runnable r):没有返回值,仅仅是把一个任务提交给线程池处理,轻量级方法,适用于处理不需要返回结果的任务;
submit(Runnable r):返回值为Future类型,future可以用来检查任务是否已经完成,获取任务的结果等,适用于需要处理返回结果的任务;
5) 请捕获线程池中子任务的代码异常