6月14号  晴  最高温度37   今天很热的一天啊,开发的任务现在正在测试阶段,手头没有什么工作任务,忙里偷闲,丰富一下我的blog。

前两天有个需求:调用第三方接口,这个接口的响应时间有点长,需要5~7秒的响应,而且只能一条一条报文发送,实时返回结果,同步请求。

所遇到的问题:需要发送的数据量特别大的时候,响应时间可能需要好几十个小时,这个明显是不能接受的。

方案:初次遇到这样的问题,没有那么丰富的经验和解决方案,能想到的就是启动多线程来解决这个问题。

下边贴出我实现的关键代码和步骤,欢迎大家发表看法和提出更好的方案。

首先是配置文件,我用的是spring的线程池,因为对方接口支持的最大并发数200,所以我设置maxPoolSize的值为200,这个值可以根据实际并发来定

在加一点  我的数据库最大连接数配的50,需要注意的是如果连接数配的小,执行并发是就会报错提示数据库连接数已超

<!-- spring多线程 -->
     <bean id="taskExecutor"
        class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <!-- 核心线程数 -->
        <property name="corePoolSize" value="100" />
        <!-- 最大线程数 -->
        <property name="maxPoolSize" value="200" />
        <!-- 队列最大长度 >=mainExecutor.maxSize -->
        <property name="queueCapacity" value="2500" />
        <!-- 线程池维护线程所允许的空闲时间 -->
        <property name="keepAliveSeconds" value="300" />
        <!-- 线程池对拒绝任务(无线程可用)的处理策略 ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃.  -->
        <property name="rejectedExecutionHandler">
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
        </property>
    </bean>

配置文件就上边一个,下边就是实现类MultiThread  需要实现Runnable接口

public class MultiThread implements Runnable {

private static final Logger     logger  = LoggerFactory.getLogger(MultiThread.class);

private IFlowPrizeService       flowPrizeService;//调用其它业务层逻辑需要这么引用

private List<Map<String,Object> listnew;

private int                     starNum = 0;                                         //分页  起始数
    private JSONObject              json    = null;

public MultiThread() {
    }

public MultiThread(IFlowPrizeService flowPrizeService, List<Map<String,Object> listnew) {
        this.flowPrizeService = flowPrizeService;
        this.listnew= listnew;
    }

@Override
    public void run() {//执行方法
        threadPrize(flowPrizeService,listnew);//具体实现
    }

}

调用

int starNum = 0;
for (int i = 0; i <= listnew.size() / 10000; i++) {//listnew需要处理的总数据量   10000是每个线程处理的最大数据量
             taskExecutor.execute(new MultiThreadNew(iFlowPrizeService,getList(listnew, 10000, starNum)));//getList是按每10000切分listnew 
             starNum += Integer.valueOf(flowPrizeThread);
}

私有方法 对总记录listnew切分

private List<Map<String,Object> getList(List<Map<String,Object> listnew,
                                               int flowPrizeThread, int starNum) {
        int end = starNum + flowPrizeThread;
        if (end >= listnew.size()) {
            end = listnew.size();
        }
        return listnew.subList(starNum, end);//subList用法

/**  List接口有一个实例方法List<E> subList(int fromIndex, int toIndex),其作用是返回一个以fromIndex为起始索引(包含),以toIndex为终止索引(不包含)的子列表(List)。
    但值得注意的是,返回的这个子列表的幕后其实还是原列表;也就是说,修改这个子列表,将导致原列表也发生改变;反之亦然。 **/
    }

spring多线程初探的更多相关文章

  1. spring 多线程 注入 服务层 问题

    在用多线程的时候,里面要用到Spring注入服务层,或者是逻辑层的时候,一般是注入不进去的.具体原因应该是线程启动时没有用到Spring实例不池.所以注入的变量值都为null. 详细:http://h ...

  2. spring多线程与定时任务

    本篇主要描述一下spring的多线程的使用与定时任务的使用. 1.spring多线程任务的使用 spring通过任务执行器TaskExecutor来实现多线程与并发编程.通常使用ThreadPoolT ...

  3. Spring.Net 初探

    Spring.Net 初探之牛刀小试   又是一个周末,感受着外面30°的高温,果断宅在家里,闲来无事,就研究了一下spring .net 框架, 在这里不得不说 vs2013确实是一个强大的开发工具 ...

  4. 【转】C++ 11 并发指南一(C++ 11 多线程初探)

    引言 C++ 11自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些C++ 11的新特性,算是记录一下自己学到的东西吧,和大家共勉. 相信Linux程序员都用过Pthrea ...

  5. Spring WebSocket初探2 (Spring WebSocket入门教程)<转>

    See more: Spring WebSocket reference整个例子属于WiseMenuFrameWork的一部分,可以将整个项目Clone下来,如果朋友们有需求,我可以整理一个独立的de ...

  6. 响应式Spring Cloud初探

    响应式Spring Cloud初探 分类:工程原文链接:The Road to Reactive Spring Cloud作者:  JOSH LONG译者: helloworldtang日期:JUNE ...

  7. intelij idea+springMVC+spring+mybatis 初探(持续更新)

    intelij idea+springMVC+spring+mybatis 初探(持续更新) intellij 创建java web项目(maven管理的SSH) http://blog.csdn.n ...

  8. Spring多线程批量发送邮件(ThreadPoolTaskExecutor)

    1,需求:使用多线程批量发送邮件 需要批量发送邮件大概400封左右,但是因为发送邮件受网络限制,所以经常导致等待超时.所以就想到了使用多线程来发邮件,因为是异步的所以返回结果不受发邮件影响. 2,思路 ...

  9. 解决spring多线程不共享事务的问题

    在一个事务中使用多线程操作数据库时,若同时存在对数据库的读写操作,可能出现数据读取的不准确,因为多线程将不会共享同一个事务(也就是说子线程和主线程的事务不一样),为了解决这个问题,可以使用spring ...

随机推荐

  1. java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification

    ListView UI重绘时触发layoutChildren, 此时会校验listView的mItemCount与其Adapter.getCount是否相同,不同报错. ListView.layout ...

  2. VS2015 未能正确加载 JavascriptWebExtensionsPackage

    解决方法: Close Visual Studio Open the %UserProfile%\AppData\Local\Microsoft\VisualStudio\<version> ...

  3. Vuejs 整合 MUi

    整合方法和使用axios的方法类似.具体步骤如下: 引入mui的css和js import mui from './lib/mui/js/mui.js' import './lib/mui/css/m ...

  4. golang的并行快速排序

    .nums[]作为core,将nums中大于core的元素放入greater,将不大于core的元素放入less 当nums长度为1时往ch中写入此元素 .分别对less和greater进行1操作(并 ...

  5. mysql数据库数据监测

    #!/bin/bash MYSQL="mysql -h10.10.10.10 -P8036 -uusername -ppassword --default-character-set=utf ...

  6. Install Tomcat 6 on CentOS or RHEL --转载

    source:http://www.davidghedini.com/pg/entry/install_tomcat_6_on_centos This post will cover installa ...

  7. Django请求响应对象

    请求与响应对象 HttpRequest HttpRequest存储了客户请求的相关参数和一些查询方法. path 请求页面的全路径,不包括域名-例如, "/hello/". met ...

  8. IOS第三方之SDWebImage

    项目中从服务器端下载图片这些几乎是必备的,使用时也很简单,只需引入SDWebImage文件 // // ViewController.m // sdWebImageDemo // // Created ...

  9. WinForm 多语言处理

    多语言处理工具我使用的是  SailingEase .NET Resources Tool ,好处是导出一个Excel,把具体翻译工作交给专业的人来做,翻译ok后再导入,缺点就是后续更改麻烦,添加一个 ...

  10. c#Image.FromFile图形加载异常处理

    public void UpdateImg(string picpath) { //更新至控件中 PnlImageShow.BackgroundImage = LoadImgPath(picpath) ...