Я должен переписать этот код с помощью агентов, так что результат 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))
Когда я хочу использовать агент с ожиданием (имя_агента), чтобы каждый поток выполнялся отдельно, это не работает, результат всегда отличен от нуля. Пожалуйста, какие-либо предложения по этому поводу?
Я попробовал это, и он печатает 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)))
Спасибо, мой друг, я застрял в этом вопросе. :D