合并技术
体积化技术是一种非常常见的编程技术,当请求较大并减少系统的频繁资源开销时,显然可以优化应用程序性能。常见的数据库连接池,线程池,对象池等。在我们的日常工作中,它们是以维护特定“池”中的“昂贵”和“时间耗尽资源”的特征,该资源规定其最小连接数量。对于统一的管理和重用,最大的连接,阻塞队列等是方便的。通常,还附有一些支持功能,例如勘探机制,强迫恢复和监测。
线程池
在实际生产环境中,可能需要许多线程来支持整个应用程序。当线程数量很大时,它将耗尽CPU资源。如果线程不受控制和管理,则会影响程序的性能。
线程费用主要包括:创建和启动线程;螺纹破坏开销;线程调度开销;线程数量限制CPU处理器。
线程池是有效使用线程的常见方法。
可以在线程池中创建一定数量的工作线程。客户端代码直接将任务作为对象提交到线程池。线程池在工作队列中放慢这些任务。
线程池的好处:
JDK提供了一组执行器工具,可以帮助开发人员有效使用线程池。
创建并使用线程池
在执行器工具类中查看newcachedthreadpool(),newsinglethreadexcecutor(),newfixedthreadpool()源代码:源代码:源代码:源代码:
newcachedthreadpool():创建一个带有缩放和收缩的线程池
newsinglethreadexcecutor():创建一个线程 - 大小线程池
newFixedThreadPool():创建一个固定的 - 大小线程池
祖先工具类中线程池的底层使用底层的ThreadPoolExecutor线程池。这些方法由ThreadPoolExecutor线程池封装:
每个参数的含义:
CorePoolSize,指定线程池中的核心线程数。
maxinumpoolsize,线程池中最大的线程数。
当keepalivetime时,当线程池螺纹的数量超过corepoolsize时,多余的自由线的生存时间,即,长时间内的空螺纹被销毁了多长时间。
单位是keepalivetime持续时间。
WorkQueue,任务队列,将任务提交到任务队列并等待执行。
线程捕获,用于创建线程的线程工厂。
处理程序拒绝该策略,如何在任务为时已晚时拒绝。
ThreadPoolExecutor构造函数的最后一个参数指定拒绝策略。当提交到线程池的任务超过实际承载能力时,如何处理?也就是说,线程池中的线程已被用尽。任务服务可以通过拒绝策略来解决此问题。JDK提供了四种类型的拒绝策略:
●流产策略会抛出异常(默认)。
●Callerrunspolicy策略,只要线程池未关闭,它将在呼叫者线程中运行当前丢弃的任务。
●丢弃任务队列中最古老的任务,然后尝试再次提交新任务。
●丢弃的人直接丢弃这项未准备好任务。
参考文章:http://ww.bjpowernode.com/javathread/1233.html
在阿里巴巴Java开发手册中解释了最好使用ThreadPoolExecutor创建线程池以避免OOM(内存溢出):
创建线程池代码描述:
补充:如何设置线程池中的最大线程数
1. CPU致密类型:最大线程数应等于CPU核数 + 1
CPU使用率很高(即某些复杂的操作,逻辑处理)
2. i/o - 致密类型:最大线的参考值应等于CPU核编号x 2
CPU消耗非常小,大多数任务都在等待IO操作(因为IO的速度远低于CPU和内存的速度)