立即杀死未来的未来线程



我正在使用

(def f 
   (future 
      (while (not (Thread/interrupted)) 
         (function-to-run))))
(Thread/sleep 100)
(future-cancel f)

在指定的时间(100ms)之后取消我的代码。
问题是,我还需要取消已经运行的功能"函数到运行",重要的是,它确实在100ms之后才能真正停止执行该功能。
我可以以某种方式将中断信号传播到函数吗?
该功能不是第三方,我自己写了。

这里要注意的基本内容是:如果没有自己的合作,就无法安全地杀死线程。由于您是希望能够过早杀死的功能的所有者,因此允许该功能优雅,安全地死亡是很有意义的。

(defn function-to-run
  []
  (while work-not-done
    (if-not (Thread/interrupted)
      ; ... do your work
      (throw (InterruptedException. "Function interrupted...")))))
(def t (Thread. (fn []
                  (try
                    (while true
                      (function-to-run))
                    (catch InterruptedException e
                      (println (.getMessage e)))))))

开始线程

(.start t)

打断它:

(.interrupt t)

您的方法不足以适合您的用例,因为仅在控制流从function-to-run返回后才检查while条件,但是您想在执行过程中停止function-to-run。此处的方法只是不同之处在于,每次通过function-to-run中的循环都会更频繁地检查条件。请注意,您也可以返回一些指示错误的值,而不是从function-to-run上抛出异常,只要您的循环在此值中的主线程检查中,您就不必完全涉及例外。

如果您的function-to-run不具有可以执行interrupted检查的循环,则可能会执行一些阻止I/O。您可能无法中断此问题,尽管许多API可以允许您指定操作中的超时。在最坏的情况下,您仍然可以在围绕呼叫的功能中对interrupted进行间歇性检查。但是底线仍然适用:您无法安全地强行停止在功能中运行的代码执行;它应该协同控制。

注意:我在这里最初的答案涉及一个示例,其中使用了Java的Thread.stop()(尽管不鼓励)。根据评论中的反馈,我对上述答案进行了修改。

最新更新