`
锅巴49
  • 浏览: 163912 次
  • 性别: 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();

    }

   

   

   

}

 

 

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

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

分享到:
评论

相关推荐

    多线程实现动态数组的相乘

    在多线程环境中,通过将任务分解成多个子任务并分配给不同的线程同时执行,可以显著提高计算效率。在本例中,我们关注的是数组相乘的并行计算,即对于两个相同大小的数组,每个元素对应位置相乘,并将结果存储在一个...

    C++多线程应用

    根据给定的信息,本文将重点围绕"C++多线程应用"这一主题展开,结合MFC框架,探讨在实际开发过程中如何高效地运用多线程技术。 ### C++多线程基础 多线程编程是现代软件开发中的一个重要组成部分,尤其对于高性能...

    Java多线程优化百万级数据

    在Java编程中,多线程是提升程序性能和并发处理能力的重要手段,特别是在处理大量数据时,如数据库的百万级数据读取。本篇将深入探讨如何利用Java多线程技术来优化这种高负载场景。 首先,理解Java多线程的基础至关...

    多线程同时查询同一数据库.zip易语言项目例子源码下载

    在IT行业中,多线程编程是一项重要的技能,尤其是在数据库访问方面。这个易语言项目例子提供了如何在多线程环境中同时查询同一数据库的示例代码,这对于优化并发性能和提高系统效率有着显著的意义。下面我们将详细...

    易语言-json解析的单线程与多线程操作实例

    而多线程操作则是将JSON解析任务分解到多个线程中,每个线程负责一部分解析工作。这种方式可以充分利用多核处理器的优势,提高程序性能,尤其在处理大量或复杂的JSON数据时效果显著。 为了更好地理解这个实例,我们...

    C语言串行并行求圆周率π.zip

    OpenMP(Open Multi-Processing)是一个跨平台的API,用于支持共享内存的多线程并行编程。在C语言中,通过包含`&lt;omp.h&gt;`头文件并使用特定的OpenMP指令,可以将任务分解到多个线程中并行执行。在这个并行π计算的例子...

    Linux下多线程的视频图像平滑度评价算法.pdf

    实验结果显示,Linux下的多线程算法相比传统串行算法,效率提升了10倍,尤其在处理大规模计算密集型任务时具有巨大的潜力。 该研究工作首先分析了视频图像平滑度与运动信息之间的关系,然后设计了一套适用于多线程...

    多芯CPU与迅速崛起的多线程编程.pdf

    多芯CPU与迅速崛起的多线程编程是计算机领域中一个重要的发展趋势。随着摩尔定律的推进,单核处理器的性能提升逐渐遇到了物理限制,多核处理器应运而生,成为提升计算能力的新途径。IBM在2001年推出双核处理器后,...

    论文研究-基于多线程技术的dBM改进算法.pdf

    它们能够将原本串行的模式匹配过程分解成多个可以并行处理的任务,从而有效地提升了模式匹配的速度。 实验结果表明,这两个新设计的算法在匹配速度上都超过了传统的d-BM算法。这种效率上的提升,对于生物信息学中的...

    Linux下多线程的视频图像平滑度评价算法 (1).pdf

    根据文中实验结果,采用多线程算法在Linux环境下的处理效率是传统串行算法的10倍,这为大规模视频图像质量评价提供了可能。 在本文中,作者首先回顾了现有的平滑度评价算法,如Jerkiness算法,然后在此基础上提出了...

    在Arduino中使用ProtoThread创建多线程系统.pdf

    这样,开发者可以将大任务分解成若干小任务块,每个任务块可以在需要时挂起和恢复执行,模拟多线程环境下的并行处理能力。 知识点二:ProtoThreads库的安装和使用 在Arduino中使用ProtoThreads库,首先需要将库文件...

    Java串行程序并行化执行

    通过深入理解CGLIB的工作原理和Java多线程机制,开发者可以有效地将串行程序转换为并行执行,从而提升系统性能。在实际开发中,除了CGLIB,还可以考虑使用Spring的AOP、Java的CompletableFuture等工具来实现异步并行...

    ncr.rar_ncr_串行并行

    在C/C++中实现并行计算,通常可以使用多线程技术(如POSIX threads,简称pthreads),或者使用OpenMP这样的库,它为C/C++提供了并行编程的接口。OpenMP支持共享内存并行模型,能够自动管理和调度线程,简化了并行...

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

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

    基于GPU的全波形并行LM分解算法.pdf

    该算法通过将串行的多次循环迭代求解参数改为单次并行计算,以实现对参数的选择,并将矩阵运算进行线程块的协同并行计算,从而提高了LM算法在通用计算图形处理器上的并行计算性能。 研究背景:波形分解是机载激光...

    算法导论第三版新增27章中文版

    本章还深入探讨了动态多线程模型的优势,例如,它简化了从串行到并行的转换,通过添加少量的关键字,就能将串行算法转化为多线程版本。此外,这种模型提供了理论分析的基础,便于理解和优化并行算法的性能。 总的来...

    Summary Use Case for Multi-threading Progress Sessions

    对于需要长时间运行的任务,如大规模数据处理或复杂的计算,多线程可以将任务分解成多个子任务并行执行,从而大大缩短了任务的完成时间。此外,通过在主线程上更新UI,用户可以在等待任务完成的过程中继续进行其他...

    计算机串行通讯程序

    - 使用多线程技术分离界面渲染和后台处理。 综上所述,设计一个计算机串行通讯程序不仅需要掌握串行通信的基本原理和技术,还需具备一定的编程能力和实践经验。通过遵循上述要求和建议,可以帮助学生更好地完成...

Global site tag (gtag.js) - Google Analytics