未来超时是否会杀死线程的执行

问题描述 投票:59回答:4

当使用 ExecutorServiceFuture 对象(在提交 Runnable tasks),如果我给future的get函数指定了一个超时值,当一个 TimeoutException 被抛出?

java concurrency executorservice future
4个回答
62
投票

不会。为什么会呢?除非你让它这么做。

例如,在Callable的情况下,这里有一个非常合理的担忧。如果你等了20秒还没有得到结果,那么你对这个结果已经不感兴趣了。这时你应该完全取消这个任务。

类似这样。

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
    }

16
投票

不,它不会。此外,甚至没有试图中断任务。首先,Future.get的超时功能并没有这么说。其次,试试我的测试,看看它是如何表现的。

    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);

在1秒内它打印

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)

再过1秒,任务成功完成。

finished

4
投票

0
投票

只需运行这两行,程序永远不会终止! :

    Future<?> f = Executors.newSingleThreadExecutor().submit(() -> System.out.println("done"));
    f.get(1, TimeUnit.SECONDS);
© www.soinside.com 2019 - 2024. All rights reserved.