Callable:
@FunctionalInterface
public interface Callable<V> {
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
V call() throws Exception;
}
Runnable:
package java.lang;
@FunctionalInterface
public interface Runnable {
void run();
}
區(qū)別:
相同點:
1.都是接口洋侨。
2.都可用來編寫多線程程序。
3.都需要調(diào)用Thread.start()啟動線程。
不同點:
1.實現(xiàn)Callable接口的任務線程能返回執(zhí)行結(jié)果;而實現(xiàn)Runnable接口的任務線程不能返回結(jié)果咏闪;
2.Callable接口的call()方法允許拋出異常;而Runnable接口的run()方法的異常只能在內(nèi)部消化摔吏,不能繼續(xù)上拋鸽嫂;
3.Callable接口支持返回執(zhí)行結(jié)果,此時需要調(diào)用FutureTask.get()方法實現(xiàn)征讲,此方法會阻塞主線程直到獲取‘將來’結(jié)果据某;當不調(diào)用此方法時,主線程不會阻塞诗箍!