future cancel失败一例
由于future線程中任務(wù)執(zhí)行時(shí)間比較長(zhǎng),有時(shí)候想停都停不下來(lái)。所以搞了個(gè)static的map:futureMap存放future對(duì)象,創(chuàng)建的時(shí)候put進(jìn)去,然后前臺(tái)通過(guò)調(diào)用取消接口,調(diào)用下面方法對(duì)線程進(jìn)行中斷。
public?String?cancelFuture(int?taskId)?{
????????try?{
????????????boolean?cancelFlag?=?futureMap.get(taskId).cancel(true);
????????????logger.info("線程中斷狀態(tài):"?+?String.valueOf(cancelFlag));
????????????return?"SUCCESS";
????????}catch?(Exception?e){
????????????logger.error("取消任務(wù)失敗",?e);
????????????return "FAILED";
????????}finally?{
????????????futureMap.remove(batchHisId);
????????}
????}
調(diào)試的過(guò)程中,發(fā)現(xiàn)日志可以打出
線程中斷狀態(tài):ture
證明是執(zhí)行了cancel的。但觀察任務(wù)的情況,實(shí)際上線程并沒(méi)有停下來(lái),線程中的任務(wù)會(huì)一直執(zhí)行到完成。
從另外一篇文章(我找不到了)中得到信息,在future的call方法中不能捕獲異常,否則中斷異常也會(huì)被捕獲,導(dǎo)致中斷失敗。
查看日志,是有拋出InterruptedException的。
最終,在call里面修改:
catch(Exception?e) {
? ? ? ? throw new InterruptedException();
}
中斷任務(wù)正常,
總結(jié)
以上是生活随笔為你收集整理的future cancel失败一例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 三个极限定理与四种收敛性
- 下一篇: 静态路由与动态路由协议OSPF、RIP简