Metoda Future.cancel () nie działa

Kod, który mam, tworzy instancję Callable i przy użyciu ExecutorService tworzony jest nowy wątek. Chcę zabić ten wątek po pewnym czasie, jeśli wątek nie zostanie wykonany z jego wykonaniem. Po przejrzeniu dokumentacji jdk zdałem sobie sprawę, że metoda Future.cancel () może być użyta do zatrzymania wykonywania wątku, ale ku mojemu przerażeniu nie działa. Oczywiście metoda future.get () wysyła przerwanie do wątku po określonym czasie (w moim przypadku 2 sekundy), a nawet wątek odbiera to przerwanie, ale przerwa ta ma miejsce tylko wtedy, gdy wątek zostanie wykonany wraz z jego wykonaniem całkowicie. Ale chcę zabić wątek po 2 sekundach.

Czy ktokolwiek mógłby mi pomóc, jak to osiągnąć.

Kod klasy testowej:

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

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

      }
}

Kod klasy Callable:

===================================================================
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";
    }

}

questionAnswers(2)

yourAnswerToTheQuestion