多线程ThreadPoolExecutor的使用方式示例,自己在实际开发过程中的案例分享;
private ExecutorService threadPool;
@PostConstruct
public void init(){
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
.setNameFormat("taskAccomplishmentAction-pool-%d").build();
//Common Thread Pool
this.threadPool = new ThreadPoolExecutor(2, 4,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
// this.threadPool = Executors.newFixedThreadPool(2);
LOGGER.info("TaskAccomplishmentAction.init finished……");
}
@Override
public List execute(final RequestEntity actionRequest) {
Object userId = actionRequest.getRequestParam().get("userId");
Assert.isTrue(!ObjectUtils.isEmpty(userId),"userId不能为空!");
Object schoolId = actionRequest.getRequestParam().get("schoolId");
Assert.isTrue(!ObjectUtils.isEmpty(schoolId),"userId不能为空!");
// 任务完成情况1 {"content_type":2,"content_id":900,"userid":80038674,"day":9,"status":1}
String visitJobUrl = prefix(profilesActive).concat("read/EWT/2019new_schedule_finish1/v1");
// 任务完成情况2 {"content_type":9,"content_id":2,"userid":80038674,"day":1,"status":1}
String questionJobUrl = prefix(profilesActive).concat("read/EWT/2019new_schedule_finish2/v1");
// 天任务完成情况3 http://dataapi.ksit.kaikela.cn/read/EWT/2019new_schedule_finish3/v1 {"content_type":8,"content_id":426,"userid":80038674,"day":12,"status":2}
String videoJobUrl = prefix(profilesActive).concat("read/EWT/2019new_schedule_finish3/v1");
//根据schoolid获取作业信息 {"content_type":2,"content_id":30088,"schoolid":25719,"ishome":0,"day":2} ishome:0表示不是作业,1是作业
String homeworkJobUrl = prefix(profilesActive).concat("read/EWT/2019new_schedule_work/v1");
final Map<String,String> paramURL = new HashMap<String, String>();
paramURL.put("visitJob",visitJobUrl);
paramURL.put("questionJob",questionJobUrl);
paramURL.put("videoJob",videoJobUrl);
paramURL.put("homeworkJob",homeworkJobUrl);
Map<String,FutureTask<List<Map>>> futureTaskMap = Maps.newHashMap();
time.set(System.currentTimeMillis());
for (final String key: paramURL.keySet()) {
FutureTask<List<Map>> futureTask = new FutureTask<List<Map>>(new Callable<List<Map>>() {
@Override
public List<Map> call() throws Exception {
return requestHttp(actionRequest, paramURL.get(key).toString(),HttpMethod.POST);
}
});
futureTaskMap.put(key,futureTask);
threadPool.submit(futureTask);
}
LOGGER.info("-->submit finish:{}",(System.currentTimeMillis() - time.get()));
time.set(System.currentTimeMillis());
List<Map> visitJob = null;
List<Map> questionJob = null;
List<Map> videoJob = null;
List<Map> homeworkJob = null;
List<Map> jobs = Lists.newArrayList();
try {
Future<List<Map>> f1 = futureTaskMap.get("visitJob");
LOGGER.info("-->future1::{}", null == f1 ? "null" : f1.isDone());
visitJob = f1.get(); // 这里会线程阻塞
f1 = futureTaskMap.get("questionJob");
LOGGER.info("-->future2::{}", null == f1 ? "null" : f1.isDone());
questionJob = f1.get();// 这里会线程阻塞
f1 = futureTaskMap.get("videoJob");
LOGGER.info("-->future3::{}", null == f1 ? "null" : f1.isDone());
videoJob = f1.get();// 这里会线程阻塞
f1 = futureTaskMap.get("homeworkJob");
LOGGER.info("-->future4::{}", null == f1 ? "null" : f1.isDone());
homeworkJob = f1.get();// 这里会线程阻塞
// 追加一起
jobs.addAll(visitJob);
jobs.addAll(questionJob);
jobs.addAll(videoJob);
if (CollectionUtils.isEmpty(jobs)){
return new ArrayList();
}
Collections.sort(jobs, new Comparator<Map>() {
@Override
public int compare(Map o1, Map o2) {
return Integer.valueOf(o1.get("day").toString()).compareTo(Integer.valueOf(o2.get("day").toString()));
}
});
} catch (Exception e ) {
LOGGER.warn("-->FutureTask,e:",e);
throw new RuntimeException("FutureTask->" + e.getMessage());
}
return jobs ;
}