2012-08-16 27 views
3

我正在学习Clojure的并发性。控制流在Clojure中的时间 - ScheduledThreadPoolExecutor的陷阱?

我在http://dev.clojure.org/display/design/Scheduled+Events跑进一个如权利要求(由Stuart塞拉?),指出:

  • 的Clojure功能不能使用时间控制流而不阻挡或Java互操作
  • 爪哇互操作(的ScheduledThreadPoolExecutor)是不知道线程本地绑定

我不明白这些说法,并请求澄清,pe可能是一个例子。具体来说:

  • ScheduledThreadPoolExecutor出现了什么问题?由于我正在开始一个新的(绿色)线程,因此我不希望每个线程绑定都能继续进行。
  • 我可以安排一个正常的Clojure函数,所以什么阻止我发送所需的绑定作为词汇关闭的上下文?

非常感谢!

回答

4

好的,我想我明白了。

假设你试试这个:

(def pool (atom nil)) 

(defn- thread-pool [] 
    (or @pool 
     (reset! pool (ScheduledThreadPoolExecutor. 1)))) 

(def ^:dynamic *t* 0) 

(binding [*t* 1] 
    (future (println "first example:" *t*))) 

(binding [*t* 1] 
    (.schedule (thread-pool) (fn [] (println "second example:" *t*)) 0 
       TimeUnit/SECONDS)) 

(binding [*t* 1] 
    (.schedule (thread-pool) (bound-fn [] (println "third example:" *t*)) 0 
       TimeUnit/SECONDS)) 

输出将是:

first example: 1 
second example: 0 
third example: 1 

在第一种情况下,未来宏观包裹体与私营功能结合搬运FN,其保留词法作用域中调用线程的绑定框架,并在调用包装函数之前将其恢复。

在第三种情况下,bound-fn将调用线程的绑定压入框架,执行函数体并弹出绑定。

在第二种情况下,没有人保存每个线程的绑定 - 一个Java类当然不知道他们,所以我们下降到Var的根值。

我希望有人在那里发现这个有趣的。