【发布时间】:2021-01-22 21:04:22
【问题描述】:
我正在 Clojure 中尝试运行独立线程,但我遇到了我不理解的不同行为。
对于我的代码编辑器,我使用的是 Atom(不是 emacs),REPL 是 Chlorine。
我正在测试一个非常简单的函数,它只打印数字。 这个从 100 打印到 1 并且不接受任何输入:
(defn pl100 []
"pl100 = Print Loop from 100 to 1"
(loop [counter 100]
(when (pos? counter)
(do
(Thread/sleep 100)
(println (str "counter: " counter))
(recur (dec counter))))))
除了需要输入之外,这个功能完全相同:
(defn pl-n [n]
"pl-n = Print Loop from n to 1"
(loop [counter n]
(when (pos? counter)
(do
(Thread/sleep 100)
(println (str "counter: " counter))
(recur (dec counter))))))
当我使用时
(.start (Thread. #(.run pl100)))
; --> prints to console REPL
; --> runs with no errors
这段代码
- 打印到控制台 REPL(我称之为 lein)和
- 运行没有错误
当我使用时
(.start (Thread. #(.run (pl-n 100))))
; prints to console REPL
; --> java.lang.NullPointerException: Cannot invoke "Object.getClass()" because "target" is null
这段代码
- 打印到控制台 REPL
- 以上述异常结束
当我使用时
(.start (Thread. pl100))
; --> prints to the console REPL
; --> runs with no errors
这段代码
- 打印到控制台 REPL
- 运行没有错误
当我使用时
(.start (Thread. (pl-n 100)))
; --> prints to Atom REPL, not console REPL!
; ends with exception
; Execution error (NullPointerException) at java.lang.Thread/<init> (Thread.java:396).
; name cannot be null
; class java.lang.NullPointerException
这段代码
- 打印到 Atom REPL(我使用的是 Atom,而不是 emacs)!不像其他人那样去控制台 REPL
- 以异常结束
那么,谁能帮我理解一下:
- 为什么当我运行一个接受输入的函数时,Java 会出错?为什么函数调用不等价?
- (.run ...) 在做什么?
- 为什么有时代码会打印到控制台,而有时会打印到 Atom/Chlorine?
【问题讨论】:
标签: multithreading concurrency clojure