Does a Future timeout kill the Thread execution

删除回忆录丶 提交于 2019-11-29 21:14:48

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
    }

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
gurvinder372

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?

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!