1、为何使用Callable而不是Runnable
Runnable不支持异常处理,而Callable可以异常处理
Runnable不能获取线程块的返回值,而Callable可以通过FutrueTask获取返回值
2、Callable的使用
创建2个线程,分别获取userInfo信息与stuInfo信息
Callable<JSONObject> userInfoCallable = new Callable<JSONObject>(){
@Override
public JSONObject call() throws Exception{
//业务逻辑,获取userInfo信息
return userInfo;
}
};
Callable<JSONObject> stuInfoCallable = new Callable<JSONObject>(){
@Override public JSONObject call() throws Exception{
//业务逻辑,获取sturInfo信息
return sturInfo;
}
};
将callable包装进FutrueTask
FutrueTask<JSONObject> userInfoTask = FutrueTask<JSONObject>(userInfoCallable );
FutrueTask<JSONObject> stuInfoTask = FutrueTask<JSONObject>(stuInfoCallable );
多线程执行
new Thread(userInfoTask).start();
new Thread(stuInfoTask ).start();
为什么不直接new Thread(userInfoCallable ).start();
因为Thread方法只能传入Runnable,而FutrueTask实现了Runnable接口
3、FutrueTask
a、构造方法传入callable
b、实现了runnable接口
c、get方法阻塞效果,让main线程等待慢的thread线程执行完毕
d、执行完毕后,通知main线程继续执行