Runnable的缺陷
    1,无返回值
    2,无法抛出异常

    Callable接口可以弥补Runnable接口的缺陷,该接口特点:
    1.类似于Runnable接口,被其它线程执行的任务
    2.实现call方法,类似实现Runnable接口重写run方法,不同点是call方法有返回值。

    Future和Callable的关系
    1,我们可以用future.get来获取Callable接口返回的执行结果,还可以通过Future.isDone()来判断任务是否已经执行完了,以及取消这个任务,限时获取任务的结果等。
    2,在call方法执行完毕之前,调用get方法的线程(假定是主线程)会被阻塞,直到call方法返回了结果,此时future.get才会得到该结果,然后主线程才会切换到Runnable状态。
    3,所以Future是一个存储器,它存储了call这个任务的结果,而这个任务的执行时间是无法提前确定的,因为这完全取决于call方法执行的情况

    Future的主要方法:
    get(),get(long timeout, TimeUnit unit):获取call执行完返回结果。
    cancel():取消任务的执行
    isDone():判断线程是否执行完毕
    isCancelled():判断是否被取消