如何将java runnable示例翻译为clojure

时间:2014-03-14 08:32:29

标签: java clojure

我对如何从这个例子翻译Runnable块感到有点困惑:

http://www.codejava.net/coding/capture-and-record-sound-into-wav-file-with-java-sound-api

    Thread stopper = new Thread(new Runnable() {
        public void run() {
            try {
                Thread.sleep(RECORD_TIME);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            recorder.finish();
        }
    });

我感到困惑的一点代码是:

   Runnable(){... public void run() {... }}

3 个答案:

答案 0 :(得分:8)

值得注意的是,clojure函数实现了Runnable。

user=> (ancestors clojure.lang.AFn)
#{clojure.lang.IFn
  java.lang.Object
  java.lang.Runnable
  java.util.concurrent.Callable}

因此,您可以将fn直接传递给Thread的构造函数。

(def stopper 
  (Thread.
    (fn []
      (try
        (Thread/sleep RECORD_TIME)
        (catch InterruptedException e
          (.printStackTrace e))))))

答案 1 :(得分:4)

可能通过future

(def recorder ( /*...*/) )
(def recorded (future (Thread/sleep RECORD_TIME)  (.finish recorder) recorder))

然后取消引用它:

@recorded 

答案 2 :(得分:2)

在原始消息中,我理解问题是如何实现接口(在本例中为java.lang.Runnable)。这可以通过reify来完成。

(reify java.lang.Runnable
  (run [this]
       (try
         (Thread/sleep RECORD_TIME))
         (catch InterruptedException e
           (.printStackTrace e))))))

当然,如果你只是想在一个单独的线程中执行一组表达式,你想要使用例如。 (未来)如上所述的罗伯曼。