Как создать ThreadPool, который выполняет случайное задание из очереди - PullRequest
1 голос
/ 12 марта 2019

ThreadPool использует BlockingQueue для хранения задач в очереди.

Я хочу исполнителя, который выбирает случайную задачу из очереди.Таким образом, первая задача и последняя задача в очереди имеют равные шансы на получение.

Возможно ли это сделать?

1 Ответ

1 голос
/ 12 марта 2019

Да, технически возможно реализовать пул потоков, который выбирает следующую задачу случайным образом. Вы можете создать экземпляр 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

...