通过Future来取消任务

一.概述

在多线程程序中,我们经常使用Future来获取线程的执行结果,我们想线程的执行是异步的,因此要想获取线程执行结束后的结果,我们就需要等线程执行结束,这是一种主动获取线程执行结果的方法,当然你也可以让线程拿到结果后通知你。在使用Future的时候我们经常会设置一个超时时间,要是过了这个超时时间,线程的结果还没返回,那么我们经常就会忽略这个结果,但是这个获取结果的线程怎么办呢?让他自生自灭?我看代码中经常有这种写法,让这样的线程自生自灭。

二.通过Future来取消线程

要是相应的线程在规定的时间内没有返回结果,我们就把这个线程给终止了,不要让它自生自灭,因为此时线程的执行已经没有意义了,要是我们不管它,让它自生自灭就等于浪费系统资源,这个点很容易被忽略,说实话自己之前也经常忽略,直到今天看书的时候才发现。下面我们来看看使用Future的良好编程习惯:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void timedRun(Runnable r, long timeout, TimeUnit unit) throws InterruptedException {
    Future<?> task = taskExec.submit(r);
    try {
        // 设置任务执行的超时时间
        task.get(timeout,unit);
    } catch(TimeoutException e) {
        // 超时异常
    } catch(ExecutionException e) {
        // 执行异常
    } finally {
        // 如果任务已经结束,那么执行取消不会带来任何影响,如果任务正在执行,那么将会被中断
        task.cancel(true);
    }
}

使用Future的时候,记得不要让没有用的任务自生自灭。