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

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日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装