Java中的所有的多线程实现方式其实只有一种,那就是Runnable实现方式
Thread是实现了Runnable
Callable底层就是一个计算接口,本身和多线程没有任何关系
Future和多线程挂钩,但也是仅此而已,因为他只有cancel、isCanceled、isDone、get方法
Callable和Future和Rannable通过一系列的组合操作,才让开发者感觉Callable也是实现多线程的一种方式
首先Future跟Runnable组合形成了RunnableFuture,而FutureTask则是实现了RunnableFuture,相当于FutureTask是同时实现了Runnable和Feature,且FutureTask中的成员变量有Callable、outcome,Thread
然后看FutureTask实现的run方法不难发现方法中定义了一个局部变量,之后调用Callable的call方法,并把call方法的返回值赋值给局部变量,之后调用set方法主要是CAS把当前线程的状态从new改成completing然后给outcome赋值,并设置是正常返回
而FutureTask的get方法则是通过判断是否正常返回返回对应的outcome或者异常
而再之后的AbstractExecutorService则是实现了ExecutorService,而ExecutorService是实现了Executors,而AbstractExecutorService的submit方法则是先把Runnable封装成FutureTask(上面的父类有Runnable),之后执行Executors的execute(Runnable)方法