El método Future.cancel () no funciona

El código que tengo crea una instancia invocable y utilizando ExecutorService se está creando un nuevo hilo. Quiero eliminar este hilo después de cierto tiempo si el hilo no se completa con su ejecución. Después de revisar la documentación de jdk, me di cuenta de que el método Future.cancel () se puede usar para detener la ejecución del hilo, pero para mi consternación no está funcionando. Por supuesto, el método future.get () es enviar una interrupción al subproceso después del tiempo estipulado (en mi caso, 2 segundos) e incluso el subproceso está recibiendo esta interrupción, pero esta interrupción se produce solo una vez que el subproceso finaliza con su ejecución. completamente. Pero quiero matar el hilo después de 2 segundos.

¿Alguien podría ayudarme a lograr esto?

Código de prueba:

====================================

public class TestExecService {

      public static void main(String[] args) {

          //checkFixedThreadPool();
          checkCallablePool();

          }

      private static void checkCallablePool()
      {
          PrintCallableTask task1 = new PrintCallableTask("thread1");

          ExecutorService threadExecutor = Executors.newFixedThreadPool(1);
          Future<String> future = threadExecutor.submit(task1);

          try {
                System.out.println("Started..");
                System.out.println("Return VAL from thread ===>>>>>" + future.get(2, TimeUnit.SECONDS));
                System.out.println("Finished!");
            }
          catch (InterruptedException e) 
          {
            System.out.println("Thread got Interrupted Exception ==============================>>>>>>>>>>>>>>>>>>>>>>>>>");
            //e.printStackTrace();
          }
          catch (ExecutionException e) 
          {
            System.out.println("Thread got Execution Exception ==============================>>>>>>>>>>>>>>>>>>>>>>>>>");
          }
          catch (TimeoutException e)
          {
            System.out.println("Thread got TimedOut Exception ==============================>>>>>>>>>>>>>>>>>>>>>>>>>");
            future.cancel(true);
          }

          threadExecutor.shutdownNow();

      }
}

Código de clase invocable:

===================================================================
package com.test;

import java.util.concurrent.Callable;

public class PrintCallableTask implements Callable<String> {

      private int sleepTime;
      private String threadName;

    public PrintCallableTask(String name)
    {
        threadName = name;
        sleepTime = 100000;     
    }

    @Override
    public String call() throws Exception {

        try {
              System.out.printf("%s going to sleep for %d milliseconds.\n", threadName, sleepTime);
              int i = 0;

              while (i < 100000)
              {
                  System.out.println(i++);
              }


              Thread.sleep(sleepTime); // put thread to sleep
              System.out.printf("%s is in middle of execution \n", threadName);

            } catch (InterruptedException exception) {
              exception.printStackTrace();
            }


            System.out.printf("%s done sleeping\n", threadName);

            return "success";
    }

}

Respuestas a la pregunta(2)

Su respuesta a la pregunta