文档章节

对Java线程池使用的总结

tanjunjie
 tanjunjie
发布于 2016/11/17 17:26
字数 767
阅读 1245
收藏 46

    最近的项目中,遇到了一些需要频繁使用sql查询,写入文件,可以拆分子任务的情况。为了提高程序吞吐量,我使用了线程池。

    一开始,考虑将用户按照数量进行分片,因为在数据库查询中,oracle对where in()有不得超过1000个查询量的限制,所以考虑将每900个用户分一片,每片为一个task,交给fix线程池处理。

    但是每个task又有查询优惠券和查询待评论数两个较大的子任务,这两个子任务需要大量的sql查询,于是又考虑将这两个子任务也封装为task,交给线程池处理。但因为主任务的执行依赖子任务的结果,如果使用同一个线程池,则子任务被提交后,work队列中被执行的任务还是主任务,cpu一直在先提交的主任务上等待Future.get()的返回,子任务得不到cpu资源去执行,一直在任务队列中等待,这将造成程序的死等待。所以将线程池由fix改为cache,希望提交的任务能得到cpu时间,不会一直在队列中等待。后来这里也引发了问题,将在下一篇文章中说明。

   当用户的账单数据被计算出来后,需要调用模板中心生成邮件,还需要将生成的邮件保存到磁盘上,这是两种不同的io密集型任务,一个是在socket上等待,一个是在本地io上等待。考虑到如果继续提交到cache线程池,那么线程池会为每个task生成一个线程,将耗费大量资源,cpu将频繁切换线程,降低了程序的吞吐量。因此新建一个fix线程池,将这些后续任务提交给fix线程池处理,线程池使用固定数量的work去跑,即能在不同阻塞情况下,让程序可以继续运行,也避免了创建大量thread的资源浪费。

    其实最后程序里用了五个线程池,分级使用的原因有以下考虑:

    为了提高程序执行效率,可以将用户先按照语言分类,然后再按照900人一片进行分片,每片任务中,又涉及到两个频繁查询数据库的子任务,每片处理完后,又需要进行网络io生产邮件和磁盘io保存邮件。如果用相同的线程池,则上级任务生产的子任务提交fix线程池后,因为work队列还在被上级任务占用,不同类型的io操作都将在task队列中等待,无法提高系统吞吐量。将下级任务提交到其他线程池后,下级任务就能有立即执行的机会,进行网络io和磁盘读写,提高了运行效率。

© 著作权归作者所有

共有 人打赏支持
tanjunjie
粉丝 10
博文 5
码字总数 2792
作品 0
成都
Java并发编程笔记之ThreadLocal内存泄漏探究

使用 ThreadLocal 不当可能会导致内存泄露,是什么原因导致的内存泄漏呢? 我们首先看一个例子,代码如下: / Created by cong on 2018/7/14. */public class ThreadLocalOutOfMemoryTest { ...

狂小白
07/14
0
0
Java并发编程之ThreadLocal内存泄漏探究

使用 ThreadLocal 不当可能会导致内存泄露,是什么原因导致的内存泄漏呢? 我们首先看一个例子,代码如下: / Created by cong on 2018/7/14. */public class ThreadLocalOutOfMemoryTest { ...

狂小白
07/14
0
0
java内存分配和String类型的深度解析

一、引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题。下面是...

萧十一郎君
2013/10/19
0
30
【Java并发专题】27篇文章详细总结Java并发基础知识

努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! github:https://github.com/CL0610/Java-concurrency,欢迎题issue和Pull request。所有的文档都是自己亲自码的,如果觉...

你听___
05/06
0
0
ThreadLocal实现原理以及内存泄漏问题

下班抽空写个博客记录下: 一、概述 ThreadLocal官网解释: 翻译过来的大概意思就是:ThreadLocal类用来提供线程内部的局部变量。这些变量在多线程环境下访问(通过get或set方法访问)时能保证...

lwang_IT
10/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
1
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
23
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
1
0
emoji

前言:随着iOS系统版本的升级,对原生emoji表情的支持也越来越丰富。emoji表情是unicode码中为表情符号设计的一组编码,当然,还有独立于unicode的另一套编码SBUnicode,在OS系统中,这两种编...

HeroHY
昨天
2
0
rabbitmq学习(二)

生产者消费者初级案列 ChannelUtils package com.hensemlee.rabbitmq;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.Connecti......

hensemlee
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部