It's not an error: vars have a root binding and thread local semantics
(*ns* is root-bound to the clojure.core namespace, and in the repl
thread it is bound to the user namespace). Since you are starting a
new thread that thread sees the root binding.
http://clojure.org/vars
But you usually don't need to use resolve directly:
(If in emacs, make sure you do M-x slime-redirect-inferior-output - if
you don't, you won't see the threads output)
user> (def zz 42)
#'user/zz
user> (.start (Thread. #(println zz)))
42
nil
user> (.start (Thread. #(println (resolve 'zz))))
nil
nil
user> (.start (Thread. #(println (ns-resolve 'user 'zz))))
#'user/zz
Regards,
/Karl