我编写了一个相当原始的测试程序(我正在为 LWJGL 的 OpenGL 类编写一个包装器,主要是出于美观的原因,我决定将多线程带入其中,因为我之前实际上从未编写过并发程序)。程序完成后,我总是收到警告
我实际上在程序进入主函数之前得到了警告。很抱歉造成混淆(我认为这可能根本不是我的程序,而是 clojure 本身的东西):
Reflection warning, NO_SOURCE_PATH:1 - call to invokeStaticMethod can't be resolved.
我在编译期间没有收到任何警告,我觉得这很奇怪。无论如何,这是程序:
(ns opengltuts.core
(:import (org.lwjgl.opengl GL11 Display))
(:use opengltuts.opengl)) ;my wrapper
(def world-state (ref {:running true :color [1.0 0.0 0.0 1.0]}))
(defn render-world [state]
(apply glClearColor (:color state))
(glClear GL11/GL_COLOR_BUFFER_BIT)
(Display/update))
(defn render []
(Display/create)
(loop []
(let [world @world-state]
(when (:running world)
(do (render-world world)
(recur)))))
(Display/destroy))
(defn -main []
; without the annotation, I get a warning here too.
(let [render-thread (doto (Thread. ^Runnable render) (.start))]
(Thread/sleep 3000)
(dosync (commute world-state assoc :color [0.0 1.0 0.0 1.0]))
(Thread/sleep 3000)
(dosync (commute world-state assoc :running false))
(.join render-thread)))
这可能不是太惯用(我听说在 Clojure 中你通常不使用 启动线程new Thread
,而是使用 Agents 或其他东西,但我还没有完全掌握它是如何工作的),但我猜对于这么短的程序没关系。