1、Runnable是线程Thread执行的对象,是线程执行的核心逻辑,核心方法run无法抛出异常,也没有返回值。
2、Callable不能作为Thread的构造函数参数,Callable只能被提交到线程池执行,核心方法call可以抛出异常,有返回值。
3、ExecutorService是线程池的通用接口,可以看成一个线程池。Runnable和Callable可以被提交到线程池来执行,通常是调用
Future result = ExecutorService.submit(Callable a)
Future result = ExecutorService.submit(Runnable a,T param)
ExecutorService.submit(Runnable a)
4、Future是线程池提交Callable后的结果集,可以看成是Callable的执行过程实体,该对象有几个主要的方法:
get()阻塞当前线程直到本线程执行完或者报错,cancel()取消本线程的执行(强行终止本线程)
5、FutureTask是Future的唯一实现类,继承了RunnableFuture接口,RunnableFuture接口又继承了Ruuable和Future接口,该类的构造函数可以传入Callable作为参数,FutureTask的run方法实际调用了Callable的call方法。
可以看出,FutureTask实现了Runnable接口,因此FutureTask可以直接用来构造线程Thread,也可以提交到线程池来执行。
同时,FutureTask也是结果集Future本身,因此可以执行get()和cancal()方法