java

4.1 Callable 接口

2、Callable 实现的线程可以返回线程执行的结果,Runnable 不能返回执行结果;

3、Callable 的 run 方法会抛出一个编译时异常,Runnable 的 run 方法没有任何异常;

4、可以使用工厂类 Executors 来把一个 Runnable 包装成一个 Callable;

4.2 Future 接口

1、一个 Future 代表一个异步执行的结果;

2、它提供了一些方法用来检查异步执行是不是已经完成了,没有完成则等待异步执行完成并取回异步执行的结果;

3、异步执行结果,只能通过 get()方法获取,get()方法是阻塞的,如果异步执行没有执行结束,则阻塞直到执行结束拿到结果;

4、它提供了一个 cancal()方法用于取消异步执行,但是一旦任务已经执行完毕,则不能取消;

5、如果你不想要执行的结果,也可以把底层的任务声明为返回 null;

cancel():如果等太久,你可以直接取消这个任务;

isCancelled():任务是不是已经取消了;

isDone():任务是不是已经完成了;

get():有 2 个 get()方法,不带参数的表示无穷等待,带参数的表示只等待给定时间;

4.3 FutureTask 类

1、FutureTask 代表一个可以取消的异步执行/计算,并且能拿到异步执行的结果;

2、FutureTask 是一个类,它实现了 Runnable 接口和 Future 接口,对这两个接口的方法进行了基本的实现,比如开始和取消一个执行,查看执行是不是已经完成,取回执行后的结果等等;

3、结果的取回,只能在执行完成后才能取回,get() 方法会阻塞,直到执行完成;

4、一旦执行完成,则不能重新开始执行,也不能取消;

5、FutureTask 可以用来包装 Runnable 或者 Callable;

6、FutureTask 可以提交到 Executor 里面去执行;