跳到主要内容

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();
}
}
}
}