Как насчет того, чтобы ваш Computation
был Runnable
(и работал с использованием предоставленного Executor
), пока не будет установлен логический флаг? Что-то вроде:
public class Computation
{
boolean volatile stopped;
public void run(){
while(!stopped){
//do magic
}
public void cancel)(){stopped=true;}
}
То, что вы делаете, по сути, останавливает поток. Тем не менее, он не получает мусор, а вместо этого используется повторно, потому что он управляется Исполнителем. Посмотрите на вопрос «Как правильно остановить поток?».
РЕДАКТИРОВАТЬ: обратите внимание, что приведенный выше код довольно примитивен в том смысле, что он предполагает, что тело цикла while занимает короткое время. Если этого не произойдет, проверка будет выполняться нечасто, и вы заметите задержку между отменой задачи и ее фактическим остановом.