如图我想多线程查询,再将每个线程查询到的结果合并,用了countdownlath。可以第一次请求可以,第二次请求我debug看到执行到await就结束了。请各位帮忙看看。
java多线程问题,多线程查询再合并结果
如图我想多线程查询,再将每个线程查询到的结果合并,用了countdownlath。可以第一次请求可以,第二次请求我debug看到执行到await就结束了。请各位帮忙看看。
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
4条回答 默认 最新
- yue_hu 2022-07-07 14:35关注
看你说请求,我猜测应该是运行在工程中的,而不是自己写在main函数中的Demo,如果是运行在工程中的,那你的线程池ThreadPoolTaskExcutor是怎么初始化的。你贴的代码中并没体现,我猜测应该是作为成员变量初始化的。而对于Bean,框架一般默认是单例,这就意味着项目启动时间初始化了线程池,然后在第一次请求后你的调用了shutdown函数销毁了线程池,下一次请求过来时这个线程池就依然是销毁状态,导致你的任务都被拒绝了。你可以看下是不是这个原因。
另外关于你的代码我提几个小建议:一是线程池的作用是为了线程复用,如果每次处理完都销毁线程池那么不但线程没得到复用,反而付出了更多的代价去创建和销毁线程池,得不偿失。线程池应该是作为一个线程复用方案,而不是一个临时的线程管理工具去用时间创建线程池用完就销毁。基于这个,线程池并不适合创建很多,正常情况下应该是一个工程单元仅拥有一个,并封装给整个工程单元使用。最多也就是做数个广度的业务线程池的划分,而不应去关联到实际的场景中去。
第二:FutureTask本身就是阻塞的,你完全没必要使用CountdownLatch,仅仅需要循环对4个task执行get就可以,也可以达到多线程执行并汇总结果的目的。
第三:你有没有发现,你将4个任务都分配给线程池,主线程却没有分配任何线程,导出当前线程处于挂起状态,其实你可以分配三个任务给线程池,余下的一个任务有主线程来做,充分的利用线程。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 网友们我该怎么办啊,急
- ¥15 混合键合键合机对准标识
- ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
- ¥15 目标跟踪,计算机视觉
- ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
- ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?
- ¥200 C++表格文件处理-悬赏
- ¥15 Windows Server2016本地登录失败
- ¥15 复合卡卡号轨道写入芯片卡
- ¥20 基于MATLAB的TDOA