多线程处理优化
- 思路:将批量数据划分成多个子任务,利用多线程并行处理这些子任务,从而加快整体处理速度。
- 关键代码片段:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
// 定义任务类
class BatchTask implements Callable<List<Result>> {
private List<Data> subDataList;
// 假设Data和Result是自定义的数据和结果类型
public BatchTask(List<Data> subDataList) {
this.subDataList = subDataList;
}
@Override
public List<Result> call() throws Exception {
List<Result> results = new ArrayList<>();
for (Data data : subDataList) {
// 具体处理逻辑,这里假设存在process方法
Result result = process(data);
results.add(result);
}
return results;
}
private Result process(Data data) {
// 实际处理数据的方法
return new Result();
}
}
// 模板方法类
abstract class BatchDataProcessor {
public final List<Result> processBatchData(List<Data> dataList) {
int numThreads = Runtime.getRuntime().availableProcessors();
ExecutorService executorService = Executors.newFixedThreadPool(numThreads);
List<Future<List<Result>>> futures = new ArrayList<>();
int subListSize = dataList.size() / numThreads;
for (int i = 0; i < numThreads; i++) {
int fromIndex = i * subListSize;
int toIndex = (i == numThreads - 1)? dataList.size() : (i + 1) * subListSize;
List<Data> subDataList = dataList.subList(fromIndex, toIndex);
BatchTask task = new BatchTask(subDataList);
futures.add(executorService.submit(task));
}
List<Result> allResults = new ArrayList<>();
for (Future<List<Result>> future : futures) {
try {
allResults.addAll(future.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
executorService.shutdown();
return allResults;
}
}
资源复用优化
- 思路:避免在每次处理数据时重复创建相同的资源,如数据库连接、网络连接等,而是复用已创建的资源。
- 关键代码片段:
// 资源管理类,单例模式保证资源唯一
class ResourceManager {
private static ResourceManager instance;
private Connection connection; // 假设是数据库连接
private ResourceManager() {
// 初始化资源
connection = DriverManager.getConnection("url", "user", "password");
}
public static ResourceManager getInstance() {
if (instance == null) {
synchronized (ResourceManager.class) {
if (instance == null) {
instance = new ResourceManager();
}
}
}
return instance;
}
public Connection getConnection() {
return connection;
}
}
// 模板方法类修改,复用资源
abstract class BatchDataProcessorWithResourceReuse {
public final List<Result> processBatchData(List<Data> dataList) {
ResourceManager resourceManager = ResourceManager.getInstance();
Connection connection = resourceManager.getConnection();
List<Result> results = new ArrayList<>();
for (Data data : dataList) {
// 使用复用的连接处理数据
Result result = process(data, connection);
results.add(result);
}
return results;
}
abstract Result process(Data data, Connection connection);
}