相同点: 两者都是接口;两者都需要调用Thread.start启动线程。 不同点: 实现Callable接口的任务线程能返回执行结果,而实现Runnable的不能;Callable接口的call方法允许抛出异常,而Runnable接口的run方法的异常只能在内部消化,不能继续往上抛;Callable接口支持返回执行结果,此时需要FutureTask.get方法实现,此方法会阻塞主线程直到获取“将来”结果,当不调用此方法时,主线程不会阻塞!