The code I created creates an instance of Callable, and using the ExecutorService a new thread is created. I want to kill this thread after a certain amount of time if the thread is not executed with its execution. After going through the jdk documentation, I realized that the Future.cancel () method can be used to stop the flow from executing, but, unfortunately, it does not work. Of course, the future.get () method sends an interrupt to Thread after the set time (in my case, it is 2 seconds), and even the thread receives this interrupt, but this interrupt only happens after the thread is fully executed. But I want to kill the stream in 2 seconds.
Can anyone help me achieve this.
Testclass Code:
==================================== 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(); } }
Class code called:
=================================================================== 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);
source share