Does a Future timeout kill the Thread execution

后端 未结 4 422
一个人的身影
一个人的身影 2020-12-23 08:55

When using an ExecutorService and Future objects (when submitting Runnable tasks), if I specify a timeout value to the future\'s get f

相关标签:
4条回答
  • 2020-12-23 09:27

    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?

    0 讨论(0)
  • 2020-12-23 09:28

    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
    
    0 讨论(0)
  • 2020-12-23 09:31

    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
        }
    
    0 讨论(0)
  • 2020-12-23 09:48

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

        Future<?> f = Executors.newSingleThreadExecutor().submit(() -> System.out.println("done"));
        f.get(1, TimeUnit.SECONDS);
    
    0 讨论(0)
提交回复
热议问题