首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在java中处理许多耗时的任务

如何在java中处理许多耗时的任务
EN

Stack Overflow用户
提问于 2021-08-28 01:31:51
回答 1查看 98关注 0票数 0

我有一个具有有限大小线程池的项目,它处理从队列中轮询的诊断任务。

有些任务类型要求线程在不同的步骤中暂停多个小时,以便等待生成数据,从而可以对诊断结果进行查询。

这带来了一个大问题,如果线程池中的任务都暂停了,那么新任务将被阻塞。但是,这些任务可能不需要为生成数据而暂停,可以立即诊断。

在我的选择中,增加线程池大小不是一个好的选择,因为任务数量可能很大,所以我想知道在java中是否有处理这个问题的好方法。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-28 01:51:03

1)非虚拟化操作系统上的,您可以在没有问题的情况下拥有2000-10000线程.取决于RAM和OS配置。所以通常这不成问题。

编写一个简单的应用程序来分配新线程,直到该步骤抛出异常为止。

2)您还可以创建一个自动调整其大小的ThreadPool:

代码语言:javascript
复制
newThreadPool = new ThreadPoolExecutor(basePoolSize, maxPoolSize, 20, TimeUnit.SECONDS, new LinkedBlockingQueue<>());

3)现在终于要回答您的问题了:

任务进入睡眠前的mode

  • pass,工作状态数据(可能是一些数据状态对象)到TODO列表(可能是PriorityQueueLinkedBlockingList,或者仅仅是ArrayList ),这取决于您想如何处理下一个step)

通过

    • leave或其他一些方法实现run()方法,这样您就不会陷入等待/阻塞阶段,而是释放线程返回到执行器池并获取新的tasks

现在,如果either

  • polls TODO list中的任务数据已成为available

,则

  • 有一个线程

    • or对某些events

的反应

  • ..。要知道何时继续执行state.
    • if
    • ,现在检查任务的数据是否处于可行的
    • 中,然后只需离开或重新添加到TODO list

即可。

    • if是的,either

使用旧的执行程序池(如果是

      • re-queue )来执行此任务

      • or将其排队到另一个专门用于恢复这些tasks

的执行器池中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68960712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档