Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 动态变量和线程/睡眠_Multithreading_Clojure_Dynamic Variables - Fatal编程技术网

Multithreading 动态变量和线程/睡眠

Multithreading 动态变量和线程/睡眠,multithreading,clojure,dynamic-variables,Multithreading,Clojure,Dynamic Variables,从我在某处读到的内容来看,如果在Clojure中将一个新值绑定到一个动态变量,那么这个新值只在该线程中可用 因此,为了测试这一点,我创建了以下代码: (def *dynamic-var* "dynamic var") (defn run-it [] (future (binding [*dynamic-var* "new-value"] (Thread/sleep 3000) (println *dynamic-var*))) (future (Thread/sleep 1000)

从我在某处读到的内容来看,如果在Clojure中将一个新值绑定到一个动态变量,那么这个新值只在该线程中可用

因此,为了测试这一点,我创建了以下代码:

(def *dynamic-var* "dynamic var")

(defn run-it [] 
  (future (binding [*dynamic-var* "new-value"] (Thread/sleep 3000) (println *dynamic-var*)))
  (future (Thread/sleep 1000) (println *dynamic-var*)))

我的问题是:为什么第一个线程(必须打印“新值”)从未运行?它从不将“新值”打印到控制台。

问题是您需要使用元数据将您的var标记为动态:

(def ^:dynamic *dynamic-var* "dynamic var")

(defn run-it [] 
  (future (binding [*dynamic-var* "new-value"] (Thread/sleep 3000) (println *dynamic-var*)))
  (future (Thread/sleep 1000) (println *dynamic-var*)))
添加了
^:dynamic
后,当您运行
(运行它)
时,它将打印出:

dynamic var
new-value
如果没有它,您可能会看到打印的警告:

警告:dynamic var未声明为dynamic,因此不可动态重新绑定,但其名称表明并非如此。请指明^:动态变量或更改名称


谢谢,明白了!我正在从静态类型的Java过渡到动态类型的Clojure。我已经习惯了IDE的支持,并且犯了很多类似这样的错误,因为这个工具没有警告我。你提到的“警告”实际上没有出现。谢谢不客气!我在REPL中运行代码时收到警告,在REPL之外运行代码时,我没有检查它是否打印。