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

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日

悬赏问题

  • ¥15 网友们我该怎么办啊,急
  • ¥15 混合键合键合机对准标识
  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 目标跟踪,计算机视觉
  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
  • ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?
  • ¥200 C++表格文件处理-悬赏
  • ¥15 Windows Server2016本地登录失败
  • ¥15 复合卡卡号轨道写入芯片卡
  • ¥20 基于MATLAB的TDOA