Альтернативой для сна ваших потоков является предоставление каждому работнику длинного значения sleepUntil. Когда ваш исполнитель вызывает работника, если он спит, он немедленно возвращается. В противном случае он выполняет свою работу, а затем возвращается. Это может помочь уменьшить счет вашего потока, потому что FixedThreadPoolExecutor сможет обрабатывать гораздо больше рабочих, чем имеет потоки, если большинство из них помечены как спящие и быстро возвращаются.
я довольно большое количество потоков, создаваемых внутри программы clojure:
(import '(java.util.concurrent Executors))
(def *pool*
(Executors/newCachedThreadPool))
(defn do-something []
; work
Thread/sleep 200
; repeat)
(dotimes [i 10000]
(.submit *pool* do-something))
Для меня это было некоторое время между JVM, и я в основном задаюсь вопросом, есть ли какой-либо аргумент против использования sleep или yield внутри функции, выполняемой Исполнителем? Если я правильно понимаю, в этом случае у каждого из моих работников есть свой собственный поток, и поэтому не должно быть никаких побочных эффектов.
Если Исполнитель использует FixedThreadPool:
(Executors/newFixedThreadPool 1000)
Все усложняется тем, что потоки не будут возвращаться в пул, пока их работа не будет завершена, а это означает, что другим работникам, находящимся в очереди, потребуется больше времени для завершения, если потоки спят.
Правильно ли мое понимание потоков в этом случае?
(Примечание: я подозреваю, что мой дизайн на самом деле неправильный, но я просто хочу убедиться, что я на правильной странице)