Executors.newFixedThreadPool()注意事项
时间: 2024-08-14 18:05:50 浏览: 48
`Executors.newFixedThreadPool()`是Java并发包提供的工具类,用于创建固定大小的工作线程池。以下是使用这个方法创建线程池时需要注意的几点:
1. **线程数设置**:你需要预先确定线程池的大小,这个大小取决于你的应用需求,过多可能导致资源浪费,过少可能导致任务处理速度慢。
2. **拒绝策略**:线程池满时,会有一个默认的拒绝策略,如果新提交的任务无法立即执行(工作线程已全部忙),那么它会被丢弃(AbortPolicy)。如果你需要自定义策略(如循环尝试、排队等待等),可以传递一个`RejectedExecutionHandler`实例给构造函数。
3. **守护线程**:默认情况下,新FixedThreadPool创建的线程不是守护线程,这意味着它们会在应用程序关闭前继续运行。如果你希望这些线程在主应用退出时自动结束,需将其设置为守护线程(通过`setDaemon(true)`)。
4. **生命周期管理**:`newFixedThreadPool`返回的是一个`ExecutorService`,你应该在不再需要时调用`shutdown`或`shutdownNow`来关闭它,防止内存泄漏。
5. **同步与并发**:由于线程池的存在,你需要确保对共享数据的访问是线程安全的,特别是在任务队列和结果处理上。
相关问题
if (!toBeInserted.isEmpty()) { jxMjKhTxService.batchInsert(toBeInserted); } if (!toBeDeleted.isEmpty()) { jxMjKhTxService.batchDelete(toBeDeleted); } 使用多线程,Java 详细代码高效
好的,以下是使用多线程实现高效批量插入和删除的Java代码示例:
```
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class BatchInsertAndDelete {
private static final int THREAD_POOL_SIZE = 10; // 线程池大小
private ExecutorService executorService; // 线程池
public BatchInsertAndDelete() {
executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
}
public void batchInsert(List<Object> toBeInserted) {
int size = toBeInserted.size();
int batchSize = size / THREAD_POOL_SIZE;
List<List<Object>> subLists = new ArrayList<>();
for (int i = 0; i < THREAD_POOL_SIZE; i++) {
int fromIndex = i * batchSize;
int toIndex = i == THREAD_POOL_SIZE - 1 ? size : (i + 1) * batchSize;
subLists.add(toBeInserted.subList(fromIndex, toIndex));
}
for (List<Object> subList : subLists) {
executorService.execute(() -> {
// 执行插入操作
});
}
}
public void batchDelete(List<Object> toBeDeleted) {
int size = toBeDeleted.size();
int batchSize = size / THREAD_POOL_SIZE;
List<List<Object>> subLists = new ArrayList<>();
for (int i = 0; i < THREAD_POOL_SIZE; i++) {
int fromIndex = i * batchSize;
int toIndex = i == THREAD_POOL_SIZE - 1 ? size : (i + 1) * batchSize;
subLists.add(toBeDeleted.subList(fromIndex, toIndex));
}
for (List<Object> subList : subLists) {
executorService.execute(() -> {
// 执行删除操作
});
}
}
public void shutdown() {
executorService.shutdown();
}
}
```
使用方法:
1. 创建 BatchInsertAndDelete 对象。
2. 调用 batchInsert() 方法批量插入数据。
3. 调用 batchDelete() 方法批量删除数据。
4. 最后调用 shutdown() 方法关闭线程池。
注意事项:
1. 通过线程池将数据拆分成多个子列表,每个子列表交由一个线程处理。
2. 线程池大小 THREAD_POOL_SIZE 可根据实际情况进行调整。
3. 插入和删除操作的具体实现需要根据业务需求进行编写。
4. 多线程处理数据时需要考虑线程安全,例如使用线程安全的容器等。
阅读全文