java多线程之CompletionService

1.创建线程task
private final class NamedEntityTask implements Callable<Boolean> {
private NamedEntity namedEntity;
private Integer index;
private Integer pageSize;
private Integer id;

public NamedEntityTask(NamedEntity namedEntity,Integer id,Integer index,Integer pageSize){
this.namedEntity=namedEntity;
this.id=id;
this.index=index;
this.pageSize=pageSize;
}
public Boolean call() throws InterruptedException {
    try {
List<NamedEntityWord> pageDatas = namedEntityWordDao.selectRelaByNamedEntityIdWithPage(id, (index - 1) * pageSize, pageSize);
for (NamedEntityWord namedEntityWord : pageDatas) {
namedEntityWord.setId(null);
namedEntityWord.setNamedEntity(namedEntity);
}
namedEntityWordDao.saveNamedEntityWords(pageDatas);
List<Word> wordList = new ArrayList<>();
for (NamedEntityWord namedEntityWord : pageDatas) {
Set<Word> words = namedEntityWord.getWords();
for (Word w : words) {
w.setId(null);
w.setNamedEntityWord(namedEntityWord);
}
wordList.addAll(words);
}
wordDao.saveWords(wordList);
log.info(Thread.currentThread().getName() + ":save named_entity........................." + namedEntity.getName() + "..........pageIndex:" + index);
return true;
} catch (Exception e) {
log.error(Thread.currentThread().getName()+"save named_entity failed...................."+namedEntity.getName()+"..........with pageIndex:"+index, e);
}
return false;

}
}
2.创建CompletionService
ExecutorService threadPool = Executors.newFixedThreadPool(4);
CompletionService<Boolean> pool = new ExecutorCompletionService<Boolean>(threadPool);
3.提交task,获取返回值,take()方法阻塞主线程,直到当前子线程执行结束,返回执行结果
public Map<String, Integer> saveEntitys(Map<String, Integer> new_agent_map,Map<String, Agent> src_agents) {
ExecutorService threadPool = Executors.newFixedThreadPool(4);
CompletionService<Boolean> pool = new ExecutorCompletionService<Boolean>(threadPool);
Collection<Agent> values = src_agents.values();
Map<String, Integer> new_named_entity_map = new HashMap<>();
for (Agent agent : values) {
Integer agent_id = agent.getId();
List<NamedEntity> namedEntities = wordDomain.selectNamedEntitysByAgentId(agent_id);

for (NamedEntity namedEntity : namedEntities) {
Integer id = namedEntity.getId();
namedEntity.setId(null);
Integer new_agent_id = new_agent_map.get(agent.getName());
namedEntity.setAgent_id(new_agent_id);
namedEntityDao.saveNamedEntity(namedEntity);
new_named_entity_map.put(namedEntity.getName(), namedEntity.getId());
final int pageSize = 200;

//计算总页数
int totalRecords = namedEntityWordDao.selectCountByNamedEntityId(id);
int totalPages = totalRecords / pageSize;
if (totalRecords % pageSize != 0) {
totalPages++;
}
for(int i=1;i<=totalPages;i++){
pool.submit(new NamedEntityTask(namedEntity,id,i,pageSize));
}

for(int i=1;i<=totalPages;i++){
try {
Boolean result = pool.take().get();
if(result)
log.info("save named_entity success............................."+namedEntity.getName()+"......with page index:"+i);
else
log.info("save named_entity failed............................."+namedEntity.getName()+"......with page index:"+i);
} catch (Exception e) {
log.error(e.getMessage(),e);
}
}
}
}
threadPool.shutdown();
return new_named_entity_map;
}
 
 
posted @ 2017-02-16 17:49  Runny_Hao  阅读(385)  评论(0)    收藏  举报