这篇文章不错Mark一下
http://www.cnblogs.com/dolphin0520/p/3949310.html
### Runnable
众所周知,实现线程的两种方式 1、extends Thread 2、implements Runnable
该接口只有一个方法就是
```java
public interface Runnable {
public abstract void run();
}
```
### Callable
因为runnable 是没有返回值的,所以有些场景会不是很方便,Callable解决了这个问题
该接口也只有一个方法,但它的run方法有了返回值
``` java
public interface Callable<T>{
T run() throws Exeception;
}
```
### Future
Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果
### FutureTask
FutureTask 是一个类,前三者是接口,FutureTask 是Future的唯一实现类
``` java
public class FutureTask<T> implements RunnableFuture<T>
```
再看RunnableFuture<T>这个接口
``` java
public interface RunnableFuture implements Runnable , Future<T>{
void run();
}
```
`总结:runnable callable 都是线程类的接口,只是前者没有返回值,后者有返回值,还会抛出异常
future 类似于线程的辅助类,可以,查看返回值、取消线程,查看线程状态等,callable返回值的体现也是和future配合使用。
future 和 future 的区别,
executorService submit callable的时候 需要通过返回值future<T>来得到返回值
executorService submit futureTask 不需要通过future<T>来获取返回值,直接submit后,通过futureTask.get方法来获取返回值
`