Sim*_*onC 16 java multithreading threadpool
是否存在线程池(在Java中)的任何实现,以确保在同一线程上执行相同逻辑ID的所有任务?
我所追求的逻辑是,如果在给定逻辑ID的特定线程上已经执行了任务,则在同一线程上安排具有相同ID的新任务.如果没有线程为同一ID执行任务,则可以使用任何线程.
这将允许并行执行不相关ID的任务,但是同一ID的任务将以串行和提交的顺序执行.
如果没有,是否有任何关于如何扩展ThreadPoolExecutor以获得此行为的建议(如果可能的话)?
UPDATE
花了更长时间考虑这个问题,我实际上并不要求在同一个线程上执行相同逻辑ID的任务,只是它们不会同时执行.
这方面的一个例子是处理客户订单的系统,可以同时处理多个订单,但不能同一个客户(并且必须按顺序处理同一客户的所有订单).
我现在采用的方法是使用标准的ThreadPoolExecutor,自定义BlockingQueue并Runnable使用自定义包装器进行包装.的Runnable包装器逻辑是:
ConcurrentHashMap)以查看当前是否正在运行相同ID的任务
然后,队列的poll()方法只返回具有当前不在"运行"集中的ID的任务.
这样做的问题在于,我确信会有很多我没有想过的极端情况,因此需要进行大量的测试.
创建一组执行程序服务,每个执行程序服务运行一个线程,并通过项目 ID 的哈希码将队列条目分配给它们。该数组可以是任意大小,具体取决于您最多要使用多少个线程。
这将限制我们可以从执行程序服务中使用,但仍然允许使用其功能在不再需要时关闭唯一的线程(使用allowCoreThreadTimeOut(true))并根据需要重新启动它。此外,所有排队的东西都可以工作而无需重写。
San*_*osh -1
扩展ThreadPoolExecutor将是相当困难的。我建议你采用生产者-消费者系统。这就是我的建议。
在这里,我假设相关 ID 是单个 ID 的逻辑集合,并且将为相关 ID 而不是单个 ID 创建生产者消费者系统。
| 归档时间: |
|
| 查看次数: |
3561 次 |
| 最近记录: |