`
锅巴49
  • 浏览: 161141 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

多线程分解串行工作

阅读更多

场景:    LIST页面,商品由A和B商品组成,A和B商品分别在不同的search,需要调用两次请求组装后返回渲染。

 

 

优点:路径简单,程序实现容易

缺点:无法发挥机器多核并行潜力

 

 

 

并行请求:

 

 

设计思路:

互相不依赖的串行调用切割成多个单独方法。

利用线程池并行计算,用ExecutorService实现

全部线程运行完毕组装结果返回,用CountDownLatch实现

如果线程满了,并发不被池接受,则调用同步方法,不影响功能实现。

 

注意:

高并发时executorService.execute 可能抛RejectedExecutionException,是当前任务不被线程池接受异常

需要在Runnable中有方法处理,并做cd.countDown();

否则会被cd.await()阻塞。

 

 

publicclass ConcurrentSearchService implements InitializingBean {

 

    protected Logger log = LoggerFactory

           .getLogger(ConcurrentSearchService.class);

 

    private SearchService searchService;

 

    private ExecutorService executorService;

 

    /**

    * 线程池的核心线程数量

    */

    privateintcoreThreadCount;

    /**

    * 线程池的最大线程数量

    */

    privateintmaxThreadCount;

 

    /**

    * 线程池中空闲线程的存活时间,单位秒

    */

    privatelongaliveTime;

 

    privateintACTIONS = 2;

 

    public SearchResultDO doSearch() {

 

       SearchResultDO searchResultDO = new SearchResultDO();

       CountDownLatch cd = new CountDownLatch(2);

 

       for (int i = 1; i <= ACTIONS; i++) {

           executeRunnable(i, cd, searchService, searchResultDO);

       }

 

       try {

           cd.await();

       } catch (InterruptedException ie) {

           // 其实不太可能被中断.

           thrownew RuntimeException(ie);

       }

 

       return searchResultDO;

    }

 

    privatevoid executeRunnable(int actionType, CountDownLatch cd,

           SearchService searchService, SearchResultDO searchResultDO) {

       SearchEngineRunnable searchEngineRunnable = new SearchEngineRunnable(

              actionType, cd, searchService, searchResultDO);

       try {

 

           executorService.execute(searchEngineRunnable);

 

       } catch (RejectedExecutionException exception) { //

           // TODO: handle exception

           searchEngineRunnable.threadErrorHandle();

           log.error("threadErrorHandle");

       }

    }

 

    publicvoid afterPropertiesSet() throws Exception {

       // TODO Auto-generated method stub

       if (this.coreThreadCount == 0) {

           this.coreThreadCount = 50;

       }

       if (this.maxThreadCount == 0) {

           this.maxThreadCount = 300;

       }

       if (this.aliveTime == 0L) {

           this.aliveTime = 30L;

       }

       executorService = new ThreadPoolExecutor(this.coreThreadCount,

              this.maxThreadCount, this.aliveTime, TimeUnit.SECONDS,

              new SynchronousQueue<Runnable>());

    }

 

}

 

 

 

publicclass SearchEngineRunnable implements Runnable {

 

   

    privateintactionType;

   

    private CountDownLatch cd;

   

    private SearchService searchService;

   

    private SearchResultDO searchResultDO;

   

    public SearchEngineRunnable(int actionType,CountDownLatch cd,SearchService searchService,SearchResultDO searchResultDO){

       this.actionType = actionType;

       this.cd = cd;

       this.searchService = searchService;

       this.searchResultDO = searchResultDO;

    }

   

    publicvoid run() {

       // TODO Auto-generated method stub

       blockHandle();

      

       cd.countDown();

    }

   

   

    privatevoid blockHandle(){

       if(actionType == 1){

           searchResultDO.setAItems(searchService.c2cSearch());

       }else{

           searchResultDO.setBItems(searchService.tmallSearch());

       }

    }

   

   

   

    publicvoid threadErrorHandle() {

       // TODO Auto-generated method stub

       blockHandle();

       cd.countDown();

    }

   

   

   

}

 

 

优点:充分利用多核并行运算能力,缩短响应时间。

缺点:程序设计较复杂,业务代码要切割成互不影响的模块供线程调用,多线程序设计。

分享到:
评论

相关推荐

    nodejs中使用多线程编程的方法实例

    在以前的博文别说不可能,nodejs中实现sleep中,我向大家介绍了nodejs addon的用法。今天的主题还是addon,继续挖掘c/c++的能力,弥补...假设总工作量W,可以分解为两个部分:只能串行计算的Ws和允许并行计算的Wp。那么

    论文研究-基于GPU异构平台的实时CT图像重建系统的研究.pdf

    采用CPU多线程流水线模式,将整个任务分解为若干个处理阶段,相邻的两个阶段之间以循环缓存连接,上一阶段完成一次计算任务后将数据放到循环缓存里,然后继续下一次的计算任务,下一阶段探测到循环缓存里有数据后从...

    深层转导式非负矩阵分解并行算法

    在线程级子矩阵乘法运算的过程中,采取生成多线程,通过共享内存交换数据计算子矩阵块的加速策略。该算法为首个实现深层转导式非负矩阵分解的并行算法。在天河二号平台上的测试结果表明,在分离多说话人混合语音信号...

    并行计算导论(原书第2版).[美]Ananth Grama(带详细书签).pdf

    2.2.4 多线程与预取间的权衡 2.3 并行计算平台剖析 2.3.1 并行平台的控制结构 2.3.2 并行平台的通信模型 2.4 并行平台的物理组织 2.4.1 理想并行计算机的体系结构 2.4.2 并行计算机互连网络 2.4.3 网络拓扑...

    论文研究-基于多核的粗粒度2.5维电磁场正演并行算法 .pdf

    基于多核的粗粒度2.5维电磁场正演并行算法,李昂,白洪涛,针对串行2.5维电磁场正演数值计算时间较长的问题,实现了一种基于CPU多核多线程的并行正演算法.使用OpenMP对频率域进行粗粒度分解,主线

    Java并发编程(学习笔记).xmind

    (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程...

    Java并发编程实战

    5.3.2 串行线程封闭76 5.3.3 双端队列与工作密取77 5.4 阻塞方法与中断方法77 5.5 同步工具类78 5.5.1 闭锁79 5.5.2 FutureTask80 5.5.3 信号量82 5.5.4 栅栏83 5.6 构建高效且可伸缩的结果缓存85 第二部分...

    orchestrated:运行在delay_job和active_record上的最小的Ruby工作流程编排框架

    通过将串行执行分解为多个排队的作业,可以使程序更具伸缩性。 这种分布式队列处理体系结构在数据处理方面有着悠久而成功的历史。 排队适用于简单,独立的任务。 简单地说,我们可以一次完成一项任务,而没有任务...

    基于多核的粗粒度2.5维电磁场正演并行算法 (2014年)

    基于CPU多核处理器实现了粗粒度2.5维电磁场并行正演算法,使用OpenMP对串行算法的频率域进行粗粒度分解,主线程进行任务分配,从线程在CPU多核上并行计算各频率域电磁场值,并分析了OpenMP并行效率与模型及核心数目的...

    软件工程-理论与实践(许家珆)习题答案

    习 题 答 案 习题一答案 一、选择题 1. 软件的主要特性是(A B C)。... 中间层:表示某个加工分解为一组子加工,其中的子加工还需进一步分解。 底层:由不再进行分解的基本加工组成。 4. 加工小说明有...

    windows驱动开发技术详解-part2

     8.5.2 内核模式下开启多线程  8.5.3 内核模式下的事件对象  8.5.4 驱动程序与应用程序交互事件对象  8.5.5 驱动程序与驱动程序交互事件对象  8.5.6 内核模式下的信号灯  8.5.7 内核模式下的互斥体  ...

    Windows驱动开发技术详解的光盘-part1

     8.5.2 内核模式下开启多线程  8.5.3 内核模式下的事件对象  8.5.4 驱动程序与应用程序交互事件对象  8.5.5 驱动程序与驱动程序交互事件对象  8.5.6 内核模式下的信号灯  8.5.7 内核模式下的互斥体  ...

    AIC的Java课程1-6章

     理解和应用Java异常,常用类,IO,集合和多线程等开发技术。  课时安排  总学时:52学时  授课:48学时 (含约20学时实验)  考试:4学时  预备知识  了解和使用操作系统,...

    代码之美(中文完整版).pdf

    14.8 针对多核系统的多线程设计 14.9 误差分析与操作计数浅析 14.10 未来的研究方向 14.11 进一步阅读 第15章 漂亮的设计会给你带来长远的好处 15.1. 对于漂亮代码的个人看法 15.2. 对于CERN库的介绍 15.3. 外在美...

Global site tag (gtag.js) - Google Analytics