遇见的问题:
公司的内容审核项目,审核人员在审核文件夹的时候,一次性批量审核通过大量文件夹,导致等待一分钟才看见审核结果,导师把任务交给我进行优化。在开会时,给出解决思路:异步解决
以前没接触过过异步,但是想到synchronized关键是是同步,加了该关键字多线程是同步(乖乖的从前执行到后,没执行完,其他线程不允许执行,显示不出来结果),不加关键字的多线程就是y异步(我是这样理解),于是乎就开始多线程(线程池)
线程池:这样创建比较常用
ExecutorService executor = new ThreadPoolExecutor(1,200,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
线程方法:异步处理,先return出success,然后线程在后台自己执行update数据库操作
public void asyncWholeReview(String groupid, String label, Integer status) throws InterruptedException {
executor.submit(new Runnable(){
@Override
public void run() {
try {
Thread.sleep(50000); //为了测试方便,进行数据库操作之前,线程先sleep
wholeReview(groupid,label,status); // 数据库更新操作
}catch(Exception e) {
throw new RuntimeException("文件组审核报错");
}
}
});
}
if (groupId != null && groupId.length() > 0) {
// groupInfoService.groupreview(groupId, AuditLabel.PASS);
String[] groupIds = groupId.split(",");
for (String groupIdTmp : groupIds) {
System.out.println("审核gid"+groupIdTmp);
// 异步处理
groupInfoService.asyncWholeReview(groupIdTmp, AuditLabel.PASS, ReviewStatus.PASS_AUDIT);
}
return "success"+"$"+groupId;
} else {
return "error";
}
这样的话,遇见一个问题:用户点击批量操作的数据,还是展示在页面中,这里直接把指定的groipId的元素进行删除
for(var i=0;i<groupId.length;i++) {
alert(groupId[i]);
document.getElementById(groupId[i]).parentElement.parentElement.remove();
alert("更新数据完成");
}