¿Es posible interrumpir un hilo específico de un ExecutorService?

Si tengo unExecutorService a la que alimento las tareas de Runnable, ¿puedo seleccionar una e interrumpirla?
Sé que puedo cancelar el futuro devuelto (también mencionadoAquí: cómo-a-interrupt-executors-thread), pero ¿cómo puedo levantar unaInterruptedException. Parece que Cancelar no lo hace (aunque debería hacerlo al observar las fuentes, tal vez la implementación de OSX sea diferente). Al menos este fragmento no lo imprime 'it!' ¿Tal vez estoy malinterpretando algo y no es la ejecución personalizable la que obtiene la excepción?

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();
}

}

Respuestas a la pregunta(1)

Su respuesta a la pregunta