项目开发中为提高效率,往往一个方法内需要起多个线程并得到返回值,下面是我自己编写通过FutureTask、Callable在启用的多线程中得到返回值(学习中,有错误请指出;请不要关注业务)
1:创建2个service(为了方便观看,我在这2个线程中增加了等待时间)
2:在action中一个方法调用这2个方法
@RequestMapping("/test")
@ResponseBody
public String test(){
long start = System.currentTimeMillis();
JSONObject jsonObject = new JSONObject();
Callable<JSONObject> userCall = new Callable() {
@Override
public Object call() throws Exception {
Org org = orgService.getOrg();
JSONObject userJson = (JSONObject) JSONArray.toJSON(org);
return userJson;
}
};
Callable<JSONObject> orgCall = new Callable<JSONObject>() {
@Override
public JSONObject call() throws Exception {
User user = userService.getUser();
JSONObject orgJson = (JSONObject) JSONArray.toJSON(user);
return orgJson;
}
};
FutureTask<JSONObject> orgTask = new FutureTask<JSONObject>(orgCall);
TestFutureTask<JSONObject> userTask = new TestFutureTask<JSONObject>(userCall);
new Thread(orgTask).start();
new Thread(userTask).start();
try {
jsonObject.putAll(orgTask.get());
jsonObject.putAll(userTask.get());
}catch (Exception e){
e.printStackTrace();
}
long end = System.currentTimeMillis();
long time = end-start;
System.out.println("总共用时-----------------------------"+time);
return jsonObject.toJSONString();
}
----------------------------------------------------------------分割线------------------------------------------------------------------------------
此处调用我new了2种FutureTask,其中一个是我自己编写的,下面我贴出我自己编写的代码,并简单介绍:
该类需要实现RunnableFuture接口
先创建2个全局变量和一个构造方法,
一个是传入的参数(),
一个为返回的参数(),
其中传入的参数通过构建方法传入
在重写run方法和get方法
我门在实际开发中不需要自己编写FutureTask,直接使用JDK提供的FutureTask就可以,我只是学习过程中看看JDK提供的FutureTask之后想自己实现一下,JDK提供的FutureTask实现原理大致也就是这样,只不过我只是实现了2个方法,别的方法如果喜欢钻研的话也可以看看实现方式,我在这就不编写了