Java并发编程学习九:Future
一、Callable vs Runnable
在前述关于线程创建的部分(线程基础),提到过Callable 和 Runnable,本质上来讲,两者都是定义线程执行内容的方法(这里不应该说是创建线程的方法,实际创建线程最终都是要基于Thread创建),同时Callable底层实现有依赖于Runnable。
1. Runnable的缺陷
相比于Callable, Runnable存在一些缺陷,具体如下:
a. 不能返回一个返回值
Runnable不能返回一个返回值,虽然可以可以利用其他的一些办法,比如在 Runnable 方法中写入日志文件或者修改某个共享的对象的办法,来达到保存线程执行结果的目的,但这属于"曲线救国"的做法。
b. 不能抛出checked Exception
对于Runnable而言,其内部的run方法既不能通在过方法签名上声明 throws 一个异常,也不能在方法内部 throw 一个 checked Exception。只能用 try catch 包裹起来。
public class RunThrowException {
/**
* 普通方法内可以 throw 异常,并在方法签名上声明 throws
*/
public void normalMethod() throws Exception {
throw new IOException();
}
Runnable runnable = new Runnable() {
/**
* run方法上无法声明 throws 异常,且run方法内无法 throw 出 checked Exception,除非使用try catch进行处理
*/
@Override
public void run() {
try {
throw new IOException();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}