JAVA线程池场景化总结

本文将通过不同的场景,对多线程及线程池使用建议进行介绍,以下场景示例将以8核心CPU为例

1)任务数多但资源占用不大

场景解读:电商平台消息推送或短信通知,对于该场景来说需要被处理的消息对象内容简单所占用资源非常少,通常为百字节量级,但在高并发访问下,可能瞬间会产生大量的务数,而此类任务的处理通常效率较高,因此在重点在于控制并发线程数,不要因为大量的线程启用及线程的上下文频繁切换而导致内存使用率过高,CPU的内核态使用率过高等不良情况发生,通常可以在创建线程池时设置较长的任务队列,并以CPU内核数2-4倍(经验值)的值设置核心线程与扩展线程数,合理固定的线程数可以使得CPU的使用率更加平滑,如

BlockingQueue queue = newArrayBlockingQueue<>(4096);

ThreadPoolExecutor executor = newThreadPoolExecutor(16, 16, 0, TimeUnit.SECONDS, queue);


2)任务数不多但资源占用大

场景解读:在非社交流媒体的使用场景下,该情况多发生于文件流、长文本对象或批量数据加工的处理,如日志收集、图片流压缩或批量订单处理等场景,而在此类的场景下的单个资源处理,又往往会发生较大的资源消耗,因此为了使系统达到较强处理能力而同时又可以控制任务资源对内存过大的使用,通常可以在创建线程池时适当加大扩展线程数量,同时设置相对合理较小的任务队列长度,如此当遇到任务数突增情况下可以有更多的并发线程来应对,此外需要合理设置扩展线程空闲回收的等待时长以节省不必要的开销,如

BlockingQueue queue = newArrayBlockingQueue<>(512);

ThreadPoolExecutor executor = newThreadPoolExecutor(16, 64, 30, TimeUnit.SECONDS, queue);


3)极端场景情况

场景解读:如遇任务资源较大、任务数较多同时处理效率不高的场景下,首先需要考虑任务的产生发起需要限流,理论上讲为保障系统的可用性及稳定运行,任务的发起能力应当略小于任务处理能力,其次对于类似场景可以采用以时间换取空间的思想,充分利用系统计算资源,当遇到任务处理能力不足的情况下,任务发起方的作业将被阻塞,从而充分保护系统的资源开销边界,但可能会导致CPU核心态的使用率高,如

BlockingQueue queue = newSynchronousQueue<>();

ThreadPoolExecutor executor = newThreadPoolExecutor(64, 64, 0, TimeUnit.SECONDS, queue);

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前段时间遇到这样一个问题,有人问微信朋友圈的上传图片的功能怎么做才能让用户的等待时间较短,比如说一下上传9张图片,...
    加油码农阅读 1,269评论 0 2
  • 【JAVA 线程】 线程 进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者...
    Rtia阅读 2,869评论 2 20
  • 写在前面 首先大家猜一下提高效率的第一步是什么? 没错就是人,首先你需要让自己拥有一颗高效的心,当然拥有了一颗高效...
    Diosamolee阅读 827评论 3 7
  • 老妈来电话说:帅子结婚了!当时脑子一抽,问:谁啊?老妈怒:就是小时候和你共饮白酒一起耍酒疯的傻小子!我噗……好...
    丛铭阅读 905评论 4 9
  • 天河飞练九如山,银雪倾泻一万年。深壑幽谷撒珠玉,滋润万物弥山涧。春夏含翠花遍野,秋冬飞雪层林染。山中神仙听瀑雨,愿...
    飘渺孤鸿_阅读 304评论 0 2

友情链接更多精彩内容