gpt4 book ai didi

java - 将给定 ID 的任务绑定(bind)到同一线程的线程池

转载 作者:太空狗 更新时间:2023-10-29 22:47:51 28 4
gpt4 key购买 nike

是否有任何线程池(在 Java 中)的实现可以确保同一逻辑 ID 的所有任务都在同一线程上执行?

我遵循的逻辑是,如果给定逻辑 ID 的特定线程上已经有一个任务正在执行,那么具有相同 ID 的新任务将安排在同一线程上。如果没有线程为同一 ID 执行任务,则可以使用任何线程。

这将允许不相关 ID 的任务并行执行,但相同 ID 的任务将按提交顺序串行执行。

如果没有,是否有任何关于如何扩展 ThreadPoolExecutor 以获得此行为的建议(如果可能的话)?

更新

经过更长时间的思考,我实际上并不要求同一逻辑 ID 的任务在同一线程上执行,只是它们不会同时执行。

这方面的一个例子是处理客户订单的系统,可以同时处理多个订单,但不能处理同一客户(同一客户的所有订单必须按顺序处理).

我目前采用的方法是使用标准的 ThreadPoolExecutor,带有自定义的 BlockingQueue 并使用自定义包装器包装 RunnableRunnable 包装逻辑是:

  1. 以原子方式尝试将 ID 添加到并发“运行”集 (ConcurrentHashMap) 以查看同一 ID 的任务当前是否正在运行
    • 如果添加失败,则将任务推回队列前端并立即返回
    • 如果成功,继续
  2. 运行任务
  3. 从“运行”集中删除任务的关联 ID

然后队列的 poll() 方法只返回 ID 当前不在“运行”集中的任务。

这样做的问题是,我确定会有很多我没有考虑过的极端情况,因此需要大量测试。 p>

最佳答案

创建一组执行程序服务,每个执行程序服务运行一个线程,并通过项目 ID 的哈希码将队列条目分配给它们。该数组可以是任意大小,具体取决于您最多要使用多少个线程。

这将限制我们可以从执行程序服务中使用,但仍然允许使用它的功能在不再需要时关闭唯一的线程(使用 allowCoreThreadTimeOut(true))并根据需要重新启动它.此外,所有排队的东西都可以在不重写的情况下工作。

关于java - 将给定 ID 的任务绑定(bind)到同一线程的线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8162332/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com