FutureTask cancel()

Ham*_*aya 2 java clojure futuretask

基本上我有以下片段,


(let [task (FutureTask. fn)
      thr (Thread. task)]
  (.start thr)
  ;;wait for signal...
  (.cancel task true)
  (.stop thr))

问题是偶尔取消不起作用,AFAICT取消原因和异常被抛出但是一些代码下线了吗?是否有可靠的方法取消未来的任务?

fn是一个基本上执行一系列长时间运行计算的函数,因此我无法循环检查布尔标志.

小智 6

没有办法在Java中自动停止正在运行的任务 - 在一般情况下,简单地"杀死"正在执行的线程是不安全的,因为这样做会使事情处于不一致状态.结果,这种能力被故意遗漏了Java.

取消任务时,在执行线程中设置一个标志,但不会抛出异常.为了允许取消任务,您必须编写代码以定期检查线程是否已被中断:

while (notDone) {
    if (Thread.isInterrupted()){
      return; // we were cancelled (or interrupted in some other way)
    }

    doSomeHardWork()
}
Run Code Online (Sandbox Code Playgroud)