Альтернативой для сна ваших потоков является предоставление каждому работнику длинного значения 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)

Все усложняется тем, что потоки не будут возвращаться в пул, пока их работа не будет завершена, а это означает, что другим работникам, находящимся в очереди, потребуется больше времени для завершения, если потоки спят.

Правильно ли мое понимание потоков в этом случае?

(Примечание: я подозреваю, что мой дизайн на самом деле неправильный, но я просто хочу убедиться, что я на правильной странице)

Ответы на вопрос(1)

Ваш ответ на вопрос