Future.cancel не гарантирует, что ваш рабочий код прекратит выполнение. То, что он делает, это установить прерванный флаг и вызвать блокировку JDK-вызовов для вызова InterruptedException. Ваш рабочий код может выбрать повторное прерванное прерывание и периодически проверять прерванный флаг, и в этом случае механизм отмены будет работать. В противном случае вы можете проглотить InterruptedException и игнорировать флаг iterrupted, и в этом случае механизм отмены ничего не сделает, но установите для отмененного флажка значение true.