可以用多线程优化的大概有两种情况:
1、存在循环很耗时
2、存在不必要同步处理的耗时代码块(没有但是可以分析拆解出来的)
代码如下
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
多线程处理后需要数据返回
public List execute(List taskList){
//比如taskList有20个任务数据需要处理
ExecutorService executorService = Executors.newFixedThreadPool(10);
// 提交多个任务
Future<?>[] futures = new Future[taskList.size()];
for (int i = 0; i < taskList.size(); i++) {
final int taskId = i;
futures[i] = executorService.submit(() -> {
Object dm =taskList.get(taskId);
/**执行任务开始**/
/**执行任务结束**/
resultList.add("存放结果");
});
}
// 关闭线程池
executorService.shutdown();
// 等待所有任务完成
List resultList=new ArrayList(20);
for (Future<?> future : futures) {
try {
resultList.add(future.get()); // 阻塞直到任务完成
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
return resultList;
}
不需要数据返回
public void execute(List taskList){
//比如taskList有20个任务数据需要处理
ExecutorService executorService = Executors.newFixedThreadPool(10);
// 提交多个任务
Future<?>[] futures = new Future[taskList.size()];
for (int i = 0; i < taskList.size(); i++) {
final int taskId = i;
futures[i] = executorService.submit(() -> {
Object dm =taskList.get(taskId);
/**执行任务开始**/
/**执行任务结束**/
resultList.add("存放结果");
});
}
// 关闭线程池
executorService.shutdown();
// 等待所有任务完成
for (Future<?> future : futures) {
try {
future.get(); // 阻塞直到任务完成
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
分析每次处理的数据相似度,次数增大后重复率变高,可以加缓存进一步提高效率
根据数据结果的大小选择本地或者redis,
本地缓存参考,使用方式自行百度
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;