我有一个具有有限大小线程池的项目,它处理从队列中轮询的诊断任务。
有些任务类型要求线程在不同的步骤中暂停多个小时,以便等待生成数据,从而可以对诊断结果进行查询。
这带来了一个大问题,如果线程池中的任务都暂停了,那么新任务将被阻塞。但是,这些任务可能不需要为生成数据而暂停,可以立即诊断。
在我的选择中,增加线程池大小不是一个好的选择,因为任务数量可能很大,所以我想知道在java中是否有处理这个问题的好方法。谢谢!
发布于 2021-08-28 01:51:03
1)非虚拟化操作系统上的,您可以在没有问题的情况下拥有2000-10000线程.取决于RAM和OS配置。所以通常这不成问题。
编写一个简单的应用程序来分配新线程,直到该步骤抛出异常为止。
2)您还可以创建一个自动调整其大小的ThreadPool:
newThreadPool = new ThreadPoolExecutor(basePoolSize, maxPoolSize, 20, TimeUnit.SECONDS, new LinkedBlockingQueue<>());3)现在终于要回答您的问题了:
任务进入睡眠前的mode
PriorityQueue或LinkedBlockingList,或者仅仅是ArrayList ),这取决于您想如何处理下一个step)通过
run()方法,这样您就不会陷入等待/阻塞阶段,而是释放线程返回到执行器池并获取新的tasks。
现在,如果either
,则
的反应
即可。
使用旧的执行程序池(如果是
的执行器池中。
https://stackoverflow.com/questions/68960712
复制相似问题