立即终止 运行 个未来线程
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()
(尽管强烈建议不要这样做)。根据评论中的反馈,我修改了上面那个的答案。
我正在使用
(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()
(尽管强烈建议不要这样做)。根据评论中的反馈,我修改了上面那个的答案。