Does a Future timeout kill the Thread execution

62,800

Solution 1

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

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

It seems that you need to kill, cancel or shutdown the task explicitly

Handling exceptions from Java ExecutorService tasks

How do I get FutureTask to return after TimeoutException?

Share:
62,800
Nico Huysamen
Author by

Nico Huysamen

I obtained my Masters, Honours, and Bachelors degrees in Computer Science at the University of Stellenbosch in South Africa. I am currently working as a software developer.

Updated on June 17, 2020

Comments

  • Nico Huysamen
    Nico Huysamen almost 4 years

    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?

  • Duncan Jones
    Duncan Jones about 11 years
    Well... that particular Future implementation doesn't. As it's an interface, one cannot make sweeping statements about all Futures.
  • Evgeniy Dorofeev
    Evgeniy Dorofeev about 11 years
    Future.get(long timeout, TimeUnit unit) doesnt say it will attempt stop the task. Besides, are there many ways to stop a running thread?
  • Duncan Jones
    Duncan Jones about 11 years
    Good response, I withdraw my complaint!
  • Thiago Kronig
    Thiago Kronig about 9 years
    Just a comment: future.cancel(true); does not stop the running underlying task, it just sets the interrupted flag to true for the running thread. It is your code that is responsible to check this flag and throw InterruptedException if it is true.
  • Dirk
    Dirk almost 9 years
    @ThiagoKronig, are you sure? from the documentation, if you pass true, the thread should be interrupted and the attempt should fail.
  • Thiago Kronig
    Thiago Kronig almost 9 years
    @Dirk, from the documentation we have: If the task has already started, then the mayInterruptIfRunning parameter determines whether the thread executing this task should be interrupted in an attempt to stop the task. Interruption here means that it will set to true a volatile flag of that thread. The code running must test for this condition to be able to stop itself. The code must stop itself.
  • mtk
    mtk over 4 years
    @Thiago can you please share sample code/link on how to code inside the callable can check the flag? What exactly will the code check?
  • Miss Chanandler Bong
    Miss Chanandler Bong almost 4 years
    This has nothing to do with the question. The default thread factory in SingleThreadExecutor returns a non-daemon thread, that is why it never terminates. Daemon Threads