Future的超时是否会终止Thread执行

时间:2013-04-26 08:01:43

标签: java concurrency executorservice future

当使用ExecutorServiceFuture个对象(提交Runnable任务时)时,如果我为未来的get函数指定了超时值,那么当{ {1}}被抛出?

4 个答案:

答案 0 :(得分:50)

没有。为什么会这样?除非你告诉它。

例如,在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
    }

答案 1 :(得分:16)

不,它没有。 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

答案 2 :(得分:4)

答案 3 :(得分:0)

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

    Future<?> f = Executors.newSingleThreadExecutor().submit(() -> System.out.println("done"));
    f.get(1, TimeUnit.SECONDS);