问题描述
我运行了一个应用程序,该应用程序计划每X次执行一些工作,为此任务我使用了scheduledexecutorservice
和java.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}