class c implements Callable<String>{
@Override
public String call() throws Exception {
return null;
}
}
class r implements Runnable{
@Override
public void run() {
}
}
相同点:
1、两者都是接口
2、两者都需要调用Thread.start启动线程
不同点:
1、如上面代码所示,callable的核心是call方法,允许返回值,runnable的核心是run方法,没有返回值
2、call方法可以抛出异常,但是run方法不行
3、因为runnable是java1.1就有了,所以他不存在返回值,后期在java1.5进行了优化,就出现了callable,就有了返回值和抛异常
4、callable和runnable都可以应用于executors。而thread类只支持runnable
测试:使用线程池来运行
public static void main(String[] args) throws Exception{
//1 创建一个线程池
//调用Executors类的静态方法
ExecutorService service = Executors.newFixedThreadPool(10);
//2提交runnable对象
service.submit(new Runnable() {
@Override
public void run() {
}
});
//3 提交callable对象
service.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return null;
}
});
//4 关闭线程池
service.shutdown();
}