Да, технически возможно реализовать пул потоков, который выбирает следующую задачу случайным образом. Вы можете создать экземпляр ThreadPool
с предоставленной абонентом очередью.
В то время как некоторым кажется странным (даже опасным или подрывным!) 1 , Queue
не обязательно является FIFO. Действительно, javadoc для Queue
утверждает:
Очереди, как правило, , но не обязательно , упорядочивают элементы в порядке FIFO (первым пришел-первым вышел).
Таким образом, все, что вам нужно сделать для реализации поведения пула случайных потоков, - это реализовать свой собственный класс BlockingQueue
с take()
, который выбирает элемент случайным образом.
В качестве альтернативы, идея @Ben Manes заключается в использовании PriorityBlockingQueue
и назначении случайных приоритетов. (Это проще, но есть издержки на поддержание очереди heapified : O(1)
в среднем, но O(logN)
в худшем случае.)
1 - На самом деле в реальном мире очереди в значительной степени являются социальным соглашением. Некоторые культуры явно не следуют этому соглашению; например https://www.thelocal.it/20150410/my-italian-habits-that-foreigners-just-dont-get. Для контраста: https://www.standard.co.uk/lifestyle/london-life/british-people-display-amazing-queuing-etiquette-without-being-told-a3528366.html