我正在使用
(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()
(尽管不鼓励)。根据评论中的反馈,我对上述答案进行了修改。