到这里,线程池中线程是如何执行任务、如何复用线程,以及线程空闲时间超限如何判断都已经清楚了。
最后,关于线程池的实现原理,我画了一张思维导图。ps:如果平台显示的不是高清图,可以在文末评论区或留言区@我,另外,本文全图文已收录到GitHub:wind7rui,后续其它内容也会更新到这里,欢迎follow、start。
使用构造方法创建线程池
细心的朋友会发现,全文竟没有介绍Executors,这个创建线程池的辅助工具类。是的,我强烈不推荐使用它,因为Executors中的newFixedThreadPool和newSingleThreadExecutor方法创建的线程池中,阻塞队列LinkedBlockingQueue的长度是Integer.MAX_VALUE,可能会堆积大量的任务,从而导致 OOM;而newCachedThreadPool方法创建的线程池中最大线程数是Integer.MAX_VALUE,会创建大量的线程,从而导致OOM。如果创建线程池,通过ThreadPoolExecutor的构造方法创建,这样使用这个线程池的人会更加明确线程池的各个参数的设置及运行方式,提前避免隐藏问题的发生。
使用自定义线程工厂
为什么要这么做呢?是因为,当项目规模逐渐扩展,各系统中线程池也不断增多,当发生线程执行问题时,通过自定义线程工厂创建的线程设置有意义的线程名称可快速追踪异常原因,高效、快速的定位问题。
使用自定义拒绝策略
虽然,JDK给我们提供了一些默认的拒绝策略,但我们可以根据项目需求的需要,或者是用户体验的需要,定制拒绝策略,完成特殊需求。
线程池划分隔离
不同业务、执行效率不同的分不同线程池,避免因某些异常导致整个线程池利用率下降或直接不可用,进而影响整个系统或其它系统的正常运行。
小结实际工作中,我们经常使用线程池,对这块的要求不仅是常规的如何使用,原理我们也要清楚是怎么回事。同时,线程池工作原理和底层实现原理也是面试必问的考题,所以,这块是一定要掌握的。
说实话,为了画这些图消耗了不少休息时间,如果你在看,点个赞支持一下我的原创吧!
学之多,而后知之少!朋友们点赞 转发是我持续更新的最大动力,我们下期见!
往期推荐:
,