如何创建从队列中执行随机任务的线程池
How to create ThreadPool that executes random task from queue
ThreadPool 使用 BlockingQueue 将任务存储在队列中。
我想要执行器从队列中获取随机任务。所以队列中的第一个任务和最后一个任务被取出的机会相同。
可以吗?
是的,在技术上可以实现随机选择下一个任务的线程池。您可以使用调用者提供的队列实例化 ThreadPool
。
虽然对某些人来说这看起来很奇怪(甚至是危险的或颠覆性的!)1,但 Queue
不一定是 FIFO。实际上 Queue
的 javadoc 状态:
Queues typically, but do not necessarily, order elements in a FIFO (first-in-first-out) manner.
因此,要实现随机线程池行为,您需要做的就是使用随机选择元素的 take()
实现您自己的 BlockingQueue
class。
或者,@Ben Manes 的想法是使用 PriorityBlockingQueue
并分配随机优先级。 (这更简单,但是保持队列 heapified 有开销:平均 O(1)
,但在最坏的情况下 O(logN)
。)
1 - 实际上,在现实世界中,排队在很大程度上是一种社会习俗。有些文化显然不遵循这个惯例。例如https://www.thelocal.it/20150410/my-italian-habits-that-foreigners-just-dont-get. By contrast: https://www.standard.co.uk/lifestyle/london-life/british-people-display-amazing-queuing-etiquette-without-being-told-a3528366.html
ThreadPool 使用 BlockingQueue 将任务存储在队列中。
我想要执行器从队列中获取随机任务。所以队列中的第一个任务和最后一个任务被取出的机会相同。
可以吗?
是的,在技术上可以实现随机选择下一个任务的线程池。您可以使用调用者提供的队列实例化 ThreadPool
。
虽然对某些人来说这看起来很奇怪(甚至是危险的或颠覆性的!)1,但 Queue
不一定是 FIFO。实际上 Queue
的 javadoc 状态:
Queues typically, but do not necessarily, order elements in a FIFO (first-in-first-out) manner.
因此,要实现随机线程池行为,您需要做的就是使用随机选择元素的 take()
实现您自己的 BlockingQueue
class。
或者,@Ben Manes 的想法是使用 PriorityBlockingQueue
并分配随机优先级。 (这更简单,但是保持队列 heapified 有开销:平均 O(1)
,但在最坏的情况下 O(logN)
。)
1 - 实际上,在现实世界中,排队在很大程度上是一种社会习俗。有些文化显然不遵循这个惯例。例如https://www.thelocal.it/20150410/my-italian-habits-that-foreigners-just-dont-get. By contrast: https://www.standard.co.uk/lifestyle/london-life/british-people-display-amazing-queuing-etiquette-without-being-told-a3528366.html