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