我将我的期货从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