未来超时是否会终止线程执行

2022-08-31 15:00:23

使用 and 对象时(提交任务时),如果我为 future 的 get 函数指定了超时值,那么当抛出 a 时,底层线程是否会被终止?ExecutorServiceFutureRunnableTimeoutException


答案 1

事实并非如此。为什么会这样呢?除非你告诉它。

例如,在可调用的情况下,这里有一个非常有效的问题。如果您等待结果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
    }

答案 2

不,它没有。莫罗弗甚至没有试图中断任务。首先,Future.get with timeout 并没有这么说。其次,尝试我的测试,看看它的行为

    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

推荐