64

使用ExecutorServiceandFuture对象时(提交Runnable任务时),如果我为future的get函数指定超时值,TimeoutException抛出a时底层线程是否会被杀死?

4

4 回答 4

72

它不是。为什么会呢?除非你告诉它。

例如,在 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
    }
于 2013-04-26T08:22:42.953 回答
18

不,它没有。Morover甚至没有尝试打断任务。首先,带有超时的 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
于 2013-04-26T08:08:53.540 回答
5

您似乎需要明确地终止、取消或关闭任务

处理来自 Java ExecutorService 任务的异常

如何让 FutureTask 在 TimeoutException 之后返回?

于 2013-04-26T08:11:41.460 回答
-1

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

    Future<?> f = Executors.newSingleThreadExecutor().submit(() -> System.out.println("done"));
    f.get(1, TimeUnit.SECONDS);
于 2020-06-16T13:16:29.613 回答