当前位置: 首页 > 面试题库 >

ExecutorService的未来任务并未真正取消

苏伟志
2023-03-14
问题内容

我将我的期货从ExecutorService推送到哈希图中。以后,我可以从哈希图中调用期货取消。尽管结果是正确的,但后来我在Callable过程中命中了断点,就好像Future
cancel()无效。我认为这里可能是两个不同的引用的情况(即使在断点时引用ID被列出为相同),但我想知道是否有些专家可以插手。代码如下所示:

ExecutorService taskExecutor = Executors.newCachedThreadPool();
Map <String, Future<Object>> results = new HashMap <String, Future<Object>>();

Future<Object> future = taskExecutor.submit(new MyProcessor(uid));
results.put(uid, future);

我允许处理继续进行(这是一个在任务传入时提交任务的循环),以后我可以尝试通过调用此方法从外部源中取消:

public static synchronized boolean cancelThread(String uid) {
    Future<Object> future = results.get(uid);
    boolean success = false;
    if (future != null) {
        success = (future.isDone() ? true : future.cancel(true));
        if (success)
            results.remove(uid);
    }
    return success;     
}

但是在调用future.cancel()之后,我仍然在MyProcessor.call()中遇到“无法取消”的路径-即它并没有真正被取消。

我在哪里错呢?有更好的办法吗?


问题答案:

后来我在Callable过程中命中了断点,就好像Future cancel()无效。

Future.cancel(true)删除队列中尚未运行的作业,但如果该作业已在运行,则html" target="_blank">执行Thread.interrupt()。这将中断位的线程上,并导致任何sleep()wait()和其他一些方法抛出InterruptedException

要认识到它确实是很重要的 停止线程。您需要主动检查线程循环中的中断标志或正确处理InterruptedException



 类似资料:
  • 我将未来从ExecutorService推送到哈希映射中。稍后,我可以在散列图中调用Futures上的cancel。虽然结果是真的,但我后来在可调用过程中遇到了断点,好像Future cancel()没有任何效果。我认为这里可能有两个不同的引用(即使在中断时引用ID是一样的),但我想知道是否有一些专家可以插话。代码如下所示: 我允许继续处理(这是一个在传入任务时提交任务的循环),稍后我可能会尝试通

  • 好吧,我想问题已经在标题中完成了。没什么大不了的,但我只是想知道。我有一个返回正确值或错误代码枚举项的方法。例如这样的东西: 其中返回一个Future,而只是修改数据。 现在我已经直观地编写了< code>Future[_],因为返回值是灵活的。但是在查看其他库时,我看到了< code>Future[Any]的用法。当你在函数的返回中使用匹配用例来检查它是什么数据时,这似乎也是合乎逻辑的。 例如,

  • 如何使用5个CompletableFutures异步执行20个可运行任务(或1个任务20次)? 这就是我得到的: 如果我执行这段代码,我可以看到它只运行3次。异步获取():3,然后在1 for()迭代中剩下2 所以,我想做所有20个任务,尽可能异步

  • 我应该创建一个从迭代器中提取下一个任务的任务吗?或者有什么更好的方法来实现这一点?

  • 问题内容: 我正在尝试使用Java的类来运行大量具有固定数量线程的重量级任务。每个任务都有很多地方,在这些地方可能会由于异常而失败。 我已经继承了子类,并且重写了应该提供运行任务时遇到的任何未捕获异常的方法。但是,我似乎无法使其工作。 例如: 该程序的输出是“一切都很好-情况正常!” 即使唯一提交给线程池的Runnable引发异常。任何线索这里发生了什么? 谢谢! 问题答案: 提交Runnable

  • 我很好奇递归构建Akka期货链的最佳方式,它将按顺序运行,如果未来的< code>doWork调用失败,未来将重试3次,如果重试次数用完,链将失败。假设所有< code>doWork调用都通过,则返回的futChain应该只完成。 < li >如何将结果作为集合获取?即,在本例中,从< code>doWork函数返回的每个< code>String(我需要以某种方式修改< code>recurse