Можно ли прервать конкретный поток в ExecutorService?

Если у меня естьExecutorService для чего я передаю Runnable задачи, могу ли я выбрать одну и прервать ее?
Я знаю, что могу отменить возвращенное будущее (также упомянутоЗдесь: как-прервать-исполнителей-поток), но как я могу поднятьInterruptedException, Кажется, что Cancel не делает этого (хотя, смотря на источники, это может произойти, может быть, реализация OSX отличается). По меньшей мере, этот фрагмент не «печатает» это! » Может быть, я что-то неправильно понимаю, и это не пользовательский исполняемый файл, который получает исключение?

public class ITTest {
static class Sth {
    public void useless() throws InterruptedException {
            Thread.sleep(3000);
    }
}

static class Runner implements Runnable {
    Sth f;
    public Runner(Sth f) {
        super();
        this.f = f;
    }
    @Override
    public void run() {
        try {
            f.useless();
        } catch (InterruptedException e) {
            System.out.println("it!");
        }
    }
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
    ExecutorService es = Executors.newCachedThreadPool();
    Sth f = new Sth();
    Future<?> lo = es.submit(new Runner(f));
    lo.cancel(true); 
    es.shutdown();
}

}

Ответы на вопрос(1)

Ваш ответ на вопрос