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