我在等待列表中有n个任务。 每个任务都有与之相关联的,它包含了一些元数据信息的条目:如何根据一些关联的元数据从列表中选择任务?
Task1 A,B
Task2 A
Task3 B,C
Task4 A,B,C
和包含像条目的asssociated的HashMap:
A 1
B 2
C 2
这意味着,如果一个任务,包含在其元信息A已经在运行,则不能同时运行包含 A的其他任务。 但是,由于B具有2个任务的限制,因此任务1和任务3可以一起运行,也可以运行任务3和任务4。 但是task1,task3和task4不能同时运行,因为A和B的限制都会被违反,尽管C的限制并不违反 。
如果我需要选择在不同的线程中运行的任务,你会建议什么逻辑/算法?而且,何时应该调用这个逻辑 ?我将任务列表视为共享资源,当从中选择任务 时,可能需要将其锁定。现在,我认为当任务被添加到列表中时可能必须调用此逻辑,并且在正在运行的任务完成时也可以调用此逻辑。但是这可能会阻止向列表中添加新元素,除非在运行逻辑之前创建列表副本。
如果我给予比A,B,C' 含有更多条目的任务的优先级高于'A,B',那么您的逻辑将如何改变?
这是Choosing a data structure for a variant of producer consumer problem和How to access the underlying queue of a ThreadpoolExecutor in a thread safe way的延续,以防万一任何人想知道问题的背景。
我刚才读的链接到您的所有其他要求:(( –
尽管如此,我仍然会用专用生产线接近这一点,所以顺序访问逻辑,并消除对明确的锁的需要。如果生产商(或任何其他线程),想要一个。准备/ INPROGRESS列出的快照,它可以排队了它的请求,(与请求内的事件等待),生产者输入队列,与所有其他的东西一起。生产者日然后读取可以向请求添加它管理的ready/inProgress队列数据的快照(复制),然后发信号通知事件。这避免了复杂的锁定方案(即间歇性死锁)。 –