如何创建从队列中执行随机任务的线程池

How to create ThreadPool that executes random task from queue

ThreadPool 使用 BlockingQueue 将任务存储在队列中。

我想要执行器从队列中获取随机任务。所以队列中的第一个任务和最后一个任务被取出的机会相同。

可以吗?

是的,在技术上可以实现随机选择下一个任务的线程池。您可以使用调用者提供的队列实例化 ThreadPool

虽然对某些人来说这看起来很奇怪(甚至是危险的或颠覆性的!)1,但 Queue 不一定是 FIFO。实际上 Queuejavadoc 状态:

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