Does a Future timeout kill the Thread execution

JavaConcurrencyExecutorserviceFuture

Java Problem Overview


When using an ExecutorService and Future objects (when submitting Runnable tasks), if I specify a timeout value to the future's get function, does the underlying thread get killed when a TimeoutException is thrown?

Java Solutions


Solution 1 - Java

It does not. Why would it? Unless you tell it to.

There is a very valid concern here in case of a Callable for example. If you waited for the result for say 20 seconds and you did not get it, then you are not interested in the result anymore. At that time you should cancel the task at all.

Something like this:

Future<?> future = service.submit(new MyCallable());
	try {
		future.get(100, TimeUnit.MILLISECONDS);
	} catch (Exception e){
		e.printStackTrace();
		future.cancel(true); //this method will stop the running underlying task
	}

Solution 2 - Java

No it doesnt. Morover there is even no attempt to interrupted the task. First of all Future.get with timeout doesn't say so. Secondly, try my test to see how it behaves

	ExecutorService ex = Executors.newSingleThreadExecutor();
	Future<?> f = ex.submit(new Runnable() {
		public void run() {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("finished");
		}
	});
	f.get(1, TimeUnit.SECONDS);

in 1 sec it prints

Exception in thread "main" java.util.concurrent.TimeoutException
	at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:228)
	at java.util.concurrent.FutureTask.get(FutureTask.java:91)
	at Test1.main(Test1.java:23)

after another 1 sec the task successfullt finishes

finished

Solution 3 - Java

Solution 4 - Java

Simply run these two lines, the program never terminates! :

    Future<?> f = Executors.newSingleThreadExecutor().submit(() -> System.out.println("done"));
    f.get(1, TimeUnit.SECONDS);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNico HuysamenView Question on Stackoverflow
Solution 1 - JavaEugeneView Answer on Stackoverflow
Solution 2 - JavaEvgeniy DorofeevView Answer on Stackoverflow
Solution 3 - Javagurvinder372View Answer on Stackoverflow
Solution 4 - JavaAtul KumarView Answer on Stackoverflow