for (Map<String,Object> subList : subLists) { // ThreadPoolExecutor executorService = BatchInsertAndDelete(); executorService.execute(() -> { // 执行删除操作 jxMjKhTxService.deleteByZybh((String) subList.get("zybh"), (Integer) subList.get("jsbh")); }); } 删除操作进不来
时间: 2024-02-14 10:36:00 浏览: 23
根据你提供的代码片段,我看不出具体的问题。但是,我可以给你一些可能的原因:
1. 你创建了一个线程池,并使用 `execute` 方法提交任务,但是没有调用 `shutdown` 方法关闭线程池,导致任务没有执行完成。
2. 任务本身可能存在问题。你可以在任务内部打印日志或者使用调试工具来定位问题所在。
3. 线程池的大小不足以处理所有的任务,导致有些任务没有得到执行。可以尝试增加线程池的大小。
希望这些提示可以帮到你。如果你有更多的信息或者代码片段,可以提供给我,我可以帮你更好地分析问题。
相关问题
ThreadPoolExecutor executorService = new ThreadPoolExecutor( 5, 10, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() ); // 将任务拆分成多个子任务 List<List<UserEo>> subUserEoList = ListUtils.splitList(userEoList, executorService); // 提交子任务到线程池中执行 for (List<UserEo> subList : subUserEoList) { executorService.execute(() -> { for (UserEo userEo : subList) { List<DataPermissionSchema> userDataPermissionSchema = getUserDataPermissionSchema(userEo.getUserUid(), userEo.getOrgCode()); redisTemplate.opsForValue().set(SystemsConstant.DATA_PERMISSION_SCHEMA + userEo.getUserUid(), ObjectUtil.toString(userDataPermissionSchema)); } }); } // 关闭线程池 executorService.shutdown();ListUtils是什么,该怎么引入
ListUtils是一个自定义的工具类,可以用来将一个List按照指定大小拆分成多个子List。您需要自己创建该工具类并引入到您的代码中使用。
以下是一个简单的ListUtils实现,供您参考:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
public class ListUtils {
/**
* 将一个List按照指定大小拆分成多个子List
*
* @param list 要拆分的List
* @param batchSize 每个子List的大小
* @param <T> List中元素的类型
* @return 拆分后的多个子List
*/
public static <T> List<List<T>> splitList(List<T> list, int batchSize) {
List<List<T>> subLists = new ArrayList<>();
int size = list.size();
int count = (size + batchSize - 1) / batchSize;
for (int i = 0; i < count; i++) {
int start = i * batchSize;
int end = Math.min((i + 1) * batchSize, size);
subLists.add(list.subList(start, end));
}
return subLists;
}
/**
* 将一个List按照指定大小拆分成多个子List,并使用线程池并发执行
*
* @param list 要拆分的List
* @param executorService 线程池
* @param batchSize 每个子List的大小
* @param action 对每个子List执行的操作
* @param <T> List中元素的类型
*/
public static <T> void splitListAndExecute(List<T> list, ExecutorService executorService, int batchSize, ListAction<T> action) {
List<List<T>> subLists = splitList(list, batchSize);
for (List<T> subList : subLists) {
executorService.execute(() -> {
for (T element : subList) {
action.execute(element);
}
});
}
}
/**
* 对List中的元素执行的操作
*
* @param <T> List中元素的类型
*/
public interface ListAction<T> {
void execute(T element);
}
}
```
您可以在使用该工具类时通过以下方式引入:
```java
import com.example.util.ListUtils;
```
// 创建一个线程池,根据CPU核心数来创建 int corePoolSize = Runtime.getRuntime().availableProcessors(); ExecutorService executorService = Executors.newFixedThreadPool(corePoolSize); // 将任务拆分成多个子任务 List<List<UserEo>> subUserEoList = ListUtils.splitList(userEoList, corePoolSize); // 提交子任务到线程池中执行 for (List<UserEo> subList : subUserEoList) { executorService.execute(() -> { for (UserEo userEo : subList) { List<DataPermissionSchema> userDataPermissionSchema = getUserDataPermissionSchema(userEo.getUserUid(), userEo.getOrgCode()); redisTemplate.opsForValue().set(SystemsConstant.DATA_PERMISSION_SCHEMA + userEo.getUserUid(), ObjectUtil.toString(userDataPermissionSchema)); } });} // 关闭线程池 executorService.shutdown();编译错误说手动创建线程池更好
手动创建线程池确实比使用Executors类中提供的静态方法更好。这是因为Executors类中的静态方法可能会使用一些默认的配置,这些配置并不一定适用于你的具体场景。另外,手动创建线程池可以让你更好地控制线程池的参数,以便更好地适应你的具体需求。
以下是手动创建线程池的示例代码:
```java
int corePoolSize = Runtime.getRuntime().availableProcessors();
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize, // 核心线程数
corePoolSize, // 最大线程数
0L, TimeUnit.MILLISECONDS, // 空闲线程存活时间
new LinkedBlockingQueue<Runnable>(), // 任务队列
Executors.defaultThreadFactory(), // 线程工厂
new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
```
在这个示例中,我们使用了ThreadPoolExecutor类来手动创建线程池。它的构造函数需要传入一些参数,包括核心线程数、最大线程数、任务队列、线程工厂和拒绝策略等。你可以根据自己的需求来设置这些参数。