帮我实现ThreadPoolExecutor工具类 并且我要批量处理用户数据,并且获得返回值
时间: 2024-11-11 20:23:36 浏览: 14
Spring线程池ThreadPoolExecutor配置并且得到任务执行的结果
5星 · 资源好评率100%
ThreadPoolExecutor 是 Java 中用于线程池管理的一个重要工具,它允许我们按照预设规则管理和调度任务。这里是一个简单的 ThreadPoolExecutor 实现示例,我们将创建一个线程池,用于批量处理用户数据并提供异步结果:
```java
import java.util.concurrent.*;
public class ThreadPoolExecutorWrapper {
private final ExecutorService executor;
private final int threadPoolSize;
public ThreadPoolExecutorWrapper(int threadPoolSize) {
this.threadPoolSize = threadPoolSize;
this.executor = new ThreadPoolExecutor(threadPoolSize, // 核心线程数
threadPoolSize, // 最大线程数
60L, // 空闲线程存活时间(单位:秒)
TimeUnit.SECONDS, // 时间单位
new ArrayBlockingQueue<>(threadPoolSize)); // 阻塞队列
}
/**
* 提交任务到线程池,传入的是处理用户数据的Callable对象,这样可以获取到Future对象作为返回值
* @param userData 用户数据
* @return Future对象,包含处理结果
*/
public Future<String> processUserData(UserData userData) {
return executor.submit(() -> {
try {
// 模拟批量处理用户数据
String result = "User data processed for " + userData.getId();
return result;
} catch (Exception e) {
throw new RuntimeException("Error processing user data", e);
}
});
}
// 关闭线程池
public void shutdown() {
executor.shutdown();
}
}
// 使用示例
public static void main(String[] args) {
ThreadPoolExecutorWrapper executor = new ThreadPoolExecutorWrapper(5);
List<UserData> users = ... // 假设这里有用户的列表
futures.forEach(executor::processUserData); // 提交所有用户的数据处理任务
// 等待所有任务完成(或超时)
try {
CompletableFuture.allOf(futures.toArray(new CompletableFuture<?>[futures.size()])).get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
executor.shutdown(); // 关闭线程池
}
class UserData {
private int id;
// getters and setters...
}
```
在这个例子中,`UserData` 类代表用户的数据,`ExecutorService` 的 `submit()` 方法将用户数据提交给线程池处理,并返回一个 `Future` 对象。你可以通过 `Future.get()` 获取最终的结果,这通常会阻塞直到任务完成。
阅读全文