Future.cancel () Methode funktioniert nicht

Der von mir erstellte Code erstellt eine Callable-Instanz und verwendet ExecutorService, um einen neuen Thread zu erstellen. Ich möchte diesen Thread nach einer bestimmten Zeit abbrechen, wenn der Thread nicht mit seiner Ausführung fertig ist. Nachdem ich die jdk-Dokumentation durchgesehen habe, habe ich festgestellt, dass die Future.cancel () -Methode verwendet werden kann, um die Ausführung des Threads zu stoppen, aber zu meinem Entsetzen funktioniert es nicht. Natürlich sendet die future.get () -Methode nach der festgelegten Zeit (in meinem Fall nach 2 Sekunden) einen Interrupt an den Thread, und selbst der Thread empfängt diesen Interrupt, aber dieser Interrupt findet erst statt, wenn der Thread seine Ausführung abgeschlossen hat vollständig. Aber ich möchte den Thread nach 2 Sekunden abbrechen.

Könnte mir jemand helfen, wie man das erreicht.

Testklassencode:

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

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

      }
}

Callable Class code:

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

}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage