我对如何从这个例子翻译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() {... }}
答案 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))))))
当然,如果你只是想在一个单独的线程中执行一组表达式,你想要使用例如。 (未来)如上所述的罗伯曼。