의 조이 Clojure의 Fogus의 책을 읽고 병렬 프로그래밍 장에서 중요한 것을 분명히 보여주고 싶지만 무엇을 찾을 수없는 함수 정의를 보았습니다. 또한, 나는이 기능이 무엇인지 볼 수 없습니다 - 내가 실행할 때, 그것은 아무것도하지 않습니다 :이 방법으로 실행하려고Clojure dothreads! 함수
(import '(java.util.concurrent Executors))
(def *pool* (Executors/newFixedThreadPool
(+ 2 (.availableProcessors (Runtime/getRuntime)))))
(defn dothreads! [f & {thread-count :threads
exec-count :times
:or {thread-count 1 exec-count 1}}]
(dotimes [t thread-count]
(.submit *pool* #(dotimes [_ exec-count] (f)))))
:
(defn wait [] (Thread/sleep 1000))
(dothreads! wait :thread-count 10 :exec-count 10)
(dothreads! wait)
(dothreads! #(println "running"))
이 ...하지만 그것은 nil을 반환합니다. 왜?
이 설명을 가져 주셔서 감사합니다! 사실, 나는 당신의 코드를 가지고 놀았습니다. 처음에는 cljr에서 아무 것도 출력하지 못했습니다 : [link] (http://i44.tinypic.com/11io8pl.png) 하지만 이상하게도 - 명령 프롬프트에서 cljr을 실행하면 (cmd) Windows에서, 그것은 바로 cmd 창에 메시지를 출력합니다! 그런 다음 익명 함수로 모든 것을 시도했습니다. (dothreads! (println "Hello"name) : threads 2 : times 4) ... 그러나 이상하게도 작동하지 않았습니다. – asdfghjkl
아마도 "cljr-without-cmd"모드에서 인쇄물이 부족한 이유는 println 함수가 "System.out.println"호출을 Java (?) 호출로 컴파일했기 때문입니다.이 호출은 올바른 인쇄를 원합니다. 일부 콘솔 출력 (?). 기본적으로 cljr은 소스 코드를 평가하는 동안 println을 "catch"하지만 print를 실행하는 다른 Java 스레드가 출력을 작성할 위치를 알지 못합니다 ... 그러나 이것은 추측입니다. – asdfghjkl
지금 당장 추측하십시오.하지만 Clojure 1.3을 사용하여 코드를 실행 해보십시오. 그게 내가 그것을 테스트 한 것입니다. 왜 당신의 예제에서 아무 것도 출력하지 못했습니다. Err, 내 대답을 수락하면, 또한 체크하십시오;) –