做一个未来的超时杀死线程执行(Does a Future timeout kill the Thre

2019-09-01 04:08发布

当使用ExecutorServiceFuture对象(提交时Runnable任务),如果我指定超时值,未来的get函数,并当一个潜在的线程被杀TimeoutException被抛出?

Answer 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
    }


Answer 2:

没有它不。 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秒任务successfullt完成

finished


Answer 3:

看来你需要杀死,明确取消或关闭任务

从Java的ExecutorService任务处理异常

我如何获得FutureTask提供TimeoutException异常后恢复?



文章来源: Does a Future timeout kill the Thread execution