首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何终止core.async/线程?

如何终止core.async/线程?
EN

Stack Overflow用户
提问于 2016-06-03 01:07:51
回答 1查看 1.7K关注 0票数 4

在一些进程中,我得到了一些由core.async/thread返回的线程,我正要关闭它们。我没有关闭我的整个程序,只关闭了这些线程。如何终止线程?

Java Thread类的.stop方法已被弃用,但我很乐意使用它,只不过core.async/thread返回的不是Thread,而是ManyToManyChannel

代码语言:javascript
复制
user=> (clojure.core.async/thread)
#object[clojure.core.async.impl.channels.ManyToManyChannel 0x780e97c0
  "clojure.core.async.impl.channels.ManyToManyChannel@780e97c0"]
user=> (type *1)
clojure.core.async.impl.channels.ManyToManyChannel

我还没有找到任何关于ManyToManyChannel的文档。这听起来像是线程类型的奇怪名称,所以这里可能有一些我不理解的基本内容。但这是我现在天真的,听起来很荒唐的问题:如何杀死一个ManyToManyChannel

clojure.repl/thread-stopper似乎对ManyToManyChannel%s没有影响。

EN

回答 1

Stack Overflow用户

发布于 2016-06-03 01:29:46

你让线程自然地终止。如果外部终止是必要的,你必须实现它。

代码语言:javascript
复制
(defn terminatable [input-ch terminate-ch]
   (thread
     (loop []
       (let [[v ch] (alts!! [input-ch terminate-ch])]
         (if (identical? ch input-ch)
           (if (some? v)
             (do (process-input v) (recur))
             ;; else input-ch has closed -> don't call recur,
             ;; thread terminates
             )
           ;; else we received sth. from terminate-ch,
           ;; or terminate-ch has closed -> don't call recur,
           ;; thread terminates
           )))))

然后通过(close! terminate-ch)在外部终止

最后,您可以通过从thread返回的通道获取数据来确定线程何时终止。

也就是说。

代码语言:javascript
复制
(take! (terminatable (chan) (doto (chan) close!)) 
       (fn [_] (println "Thread is terminated")))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37598084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档