我必须以某种方式使用代理重写此代码,x的结果为0(这意味着每个线程一个接一个地执行(。但是我遇到了问题,因为我对代理的使用没有足够的了解。原始代码是:
(def x 0)
(let [t1 (Thread. #(dotimes [_ 10000] (def x (inc x))))
t2 (Thread. #(dotimes [_ 10000] (def x (dec x))))]
(.start t1)
(.start t2)
(.join t1)
(.join t2)
(println x))
当我想使用带有 await(agent_name( 的代理使每个线程单独运行时,它不起作用,结果总是与零不同。请对此提出任何建议?
我试了一下,它按预期打印0
:
(ns agent-demo.core
(:gen-class))
(def counter
(agent 0))
(defn -main [& args]
(let [t1 (Thread. #(dotimes [_ 10000]
(send counter inc)))
t2 (Thread. #(dotimes [_ 10000]
(send counter dec)))]
(.start t1)
(.start t2)
(.join t1)
(.join t2)
(await counter)
(println @counter)
(shutdown-agents)))