立即终止 运行 个未来线程

Immediately kill a running future thread

我正在使用

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

(Thread/sleep 100)
(future-cancel f)

在指定时间(100 毫秒)后取消我的代码。
问题是,我还需要取消已经 运行 的函数 'function-to-run',重要的是它在 100 毫秒后真正停止执行该函数。
我能以某种方式将中断信号传播到函数吗?
函数不是第三方的,是我自己写的。

这里要注意的基本事项是:没有线程自身的合作,您无法安全地终止线程。由于您是您希望能够过早终止的函数的所有者,因此允许该函数合作并优雅安全地终止是有意义的。

(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)

您的方法不足以满足您的用例,因为 while 条件仅在控制流 return 从 function-to-run 编辑后才被检查,但您想停止 function-to-run 在其执行期间。这里的做法只是不同,条件检查的频率更高,即每次都通过function-to-run中的循环。请注意,除了从 function-to-run 中抛出异常,您还可以 return 一些指示错误的值,只要主线程中的循环检查此值,您就不必涉及完全没有例外。

如果您的 function-to-run 没有可以执行 interrupted 检查的循环,那么它可能正在执行一些阻塞 I/O。您可能无法中断此操作,但许多 API 将允许您指定操作的超时时间。在最坏的情况下,您仍然可以在您的调用周围的函数中对 interrupted 执行间歇性检查。但底线仍然适用:您不能安全地强行停止函数中代码 运行 的执行;它应该合作让出控制权。

注意: 我在这里的原始答案涉及提供一个示例,其中使用了 java 的 Thread.stop()(尽管强烈建议不要这样做)。根据评论中的反馈,我修改了上面那个的答案。