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

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 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题