相同点:
都是接口
都可以编写多线程程序
都采用Thread.start()方法启动
不同点:
Runable没有返回值,run()方法返回类型为void,Callable方法有返回值,call()方法返回类型为泛型和Future、FutureTask配合使用可以获取方法返回值;Callable的call()方法允许向上抛出异常,Runable的run()方法不允许向上抛出异常,只能在内部消化;获取call()方法的返回值需要用到Future的get方法,此方法会阻塞主线程的向下执行。
优点:
多线程返回执行结果是很有用的一个特性,因为多线程相比单线程更难、更复杂的一个重要原因就是因为多线程充满着未知性,某条线程是否执行了?某条线程执行了多久?某条线程执行的时候我们期望的数据是否已经赋值完毕?无法得知,我们能做的只是等待这条多线程的任务执行完毕而已。而Callable+Future/FutureTask却可以获取多线程运行的结果,可以在等待时间太长没获取到需要的数据的情况下取消该线程的任务,真的是非常有用。