xtdn. 2022-07-07 08:57 采纳率: 57.1%
浏览 672
已结题

java多线程问题,多线程查询再合并结果

img

img


如图我想多线程查询,再将每个线程查询到的结果合并,用了countdownlath。可以第一次请求可以,第二次请求我debug看到执行到await就结束了。请各位帮忙看看。

  • 写回答

4条回答 默认 最新

  • yue_hu 2022-07-07 14:35
    关注

    看你说请求,我猜测应该是运行在工程中的,而不是自己写在main函数中的Demo,如果是运行在工程中的,那你的线程池ThreadPoolTaskExcutor是怎么初始化的。你贴的代码中并没体现,我猜测应该是作为成员变量初始化的。而对于Bean,框架一般默认是单例,这就意味着项目启动时间初始化了线程池,然后在第一次请求后你的调用了shutdown函数销毁了线程池,下一次请求过来时这个线程池就依然是销毁状态,导致你的任务都被拒绝了。你可以看下是不是这个原因。
    另外关于你的代码我提几个小建议:一是线程池的作用是为了线程复用,如果每次处理完都销毁线程池那么不但线程没得到复用,反而付出了更多的代价去创建和销毁线程池,得不偿失。线程池应该是作为一个线程复用方案,而不是一个临时的线程管理工具去用时间创建线程池用完就销毁。基于这个,线程池并不适合创建很多,正常情况下应该是一个工程单元仅拥有一个,并封装给整个工程单元使用。最多也就是做数个广度的业务线程池的划分,而不应去关联到实际的场景中去。
    第二:FutureTask本身就是阻塞的,你完全没必要使用CountdownLatch,仅仅需要循环对4个task执行get就可以,也可以达到多线程执行并汇总结果的目的。
    第三:你有没有发现,你将4个任务都分配给线程池,主线程却没有分配任何线程,导出当前线程处于挂起状态,其实你可以分配三个任务给线程池,余下的一个任务有主线程来做,充分的利用线程。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月15日
  • 已采纳回答 7月7日
  • 创建了问题 7月7日

悬赏问题

  • ¥65 LineageOs-21.0系统编译问题
  • ¥30 关于#c++#的问题,请各位专家解答!
  • ¥15 App的会员连续扣费
  • ¥15 不同数据类型的特征融合应该怎么做
  • ¥15 用proteus软件设计一个基于8086微处理器的简易温度计
  • ¥15 用联想小新14Pro
  • ¥15 multisim中关于74ls192n和DSWPK开关仿真图分析(减法计数器)
  • ¥15 w3wp,exe 中发生未处理的 Microsoft ,NETFramework 异常。
  • ¥20 C51单片机程序及仿真(加减器)
  • ¥15 AQWA | 水动力分析 二阶波浪力