有没有办法了解为什么java.util.concurrent.Future无法取消?

问题描述

我运行了一个应用程序,该应用程序计划每X次执行一些工作,为此任务我使用了scheduledexecutorservicejava.util.concurrent.Future
一切正常,但我想在将来解决可能的问题,为此,我想记录失败的原因。

示例:

private  scheduledexecutorservice executeScheduler = Executors.newSingleThreadScheduledExecutor();
private   ScheduledFuture doSomthing = executeScheduler.scheduleAtFixedrate(() -> {DO SOMETHING},1000,MILLISECONDS);
if(doSomthing.cancel(!true)){
    logger.warn("WHY Failed");
}

解决方法

java.​util.​concurrent.​Future 如果任务已经完成,已经被取消或由于某些其他原因而无法取消,则.cancel()将失败。如果成功,并且在调用cancel时此任务尚未开始,则该任务永远不要运行。如果任务已经开始,则.cancel(true/false)参数确定是否应中断执行该任务的线程以尝试停止该任务。

如果您使用(true)并且线程/ {DO SOMTHING}被打断,则可以通过调用 doSomthing.get() 它抛出InterruptedException,ExecutionException; 所以应该用try / catch包裹它。

请注意,.get()锁定并仅返回一个throwable。但在您的情况下,很明显原因是InterruptedException, 或者,也许您不想首先使用该.cancel?

如果尝试捕获一般的运行异常,则必须在线程运行方法中或在此处包装一个大try / catch: {DO SOMETHING}