Они обычно не делают одно и то же, поскольку действуют на разных уровнях абстракции (задачи имеют более высокий уровень абстракции, чем потоки).В этом случае, однако, вызовы кажутся избыточными.
FutureTask.cancel()
сообщает задаче, что ее больше не нужно запускать и (если true
передается в качестве аргумента), будетпопытка прервать Thread
, на которой в данный момент выполняется задача (если есть).
t.interrupt()
попытка прервать Thread
t
.
В этом случае это кажется излишним. Если Task
все еще работает, то cancel(true)
должен прервать поток, и в этом случае дублирующий вызов interrupt()
не требуется (если код, выполняющийся в потоке каким-либо образомигнорирует одно прерывание, но останавливает при двух прерываниях, что маловероятно).
Если в этот момент задание уже выполнено, то оба cancel()
и interrupt()
не будет иметь эффекта.