如何将一个Java Runnable示例翻译为Clojure

4

1
嗯,不要在InterruptedException中打印printStackTrace()... 至少,在catch块中应该使用Thread.currentThread().interrupt() - fge
最好(更安全和易读)使用TimerScheduledExecutorService,应尽量避免使用基于Threadsleep()方法!然而,这并不真正有助于翻译... - Boris the Spider
你需要一对一地翻译吗?在Clojure中,你可以通过编程调用(-> Thread .run)。 - WeGi
新的Runnable(){}和reify是一样的吗? - zcaudate
在Clojure中,您无需使用普通的Runnable对象,有其他处理并发和线程的方法。 - robermann
3个回答

9
值得注意的是,Clojure函数实现了Runnable接口。
user=> (ancestors clojure.lang.AFn)
#{clojure.lang.IFn
  java.lang.Object
  java.lang.Runnable
  java.util.concurrent.Callable}

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

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

4

可能通过future实现:

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

然后解除其引用:

@recorded 

3

从原始信息中我理解问题是如何实现一个接口(在此例中是java.lang.Runnable)。这可以通过reify完成。

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

当然,如果你只想在单独的线程中执行一组表达式,你需要使用像(robermann上面提到的)future这样的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接