ExecutorService executorService = Executors.newFixedThreadPool(threadCount);改为手动创建线程
时间: 2023-07-27 18:12:48 浏览: 88
可以使用如下代码手动创建线程并执行任务:
```
int threadCount = 10; // 线程数量
List<Thread> threads = new ArrayList<>(threadCount);
for (int i = 0; i < threadCount; i++) {
Thread thread = new Thread(() -> {
// 执行任务代码
});
threads.add(thread);
thread.start(); // 启动线程
}
// 等待所有线程执行完成
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
```
需要注意的是,手动创建线程需要自己管理线程的生命周期和线程池大小,如果线程数量过多可能会导致系统资源消耗较大,因此建议使用线程池来管理线程。
相关问题
executor = Executors.newFixedThreadPool(THREAD_COUNT); 打印获取到了几个线程
当你使用 `Executors.newFixedThreadPool(THREAD_COUNT)` 创建一个固定大小的线程池时,它会预创建 THREAD_COUNT 个线程。但是,这并不意味着你可以直接打印出来获取到的确切线程数。实际上,线程池内部管理的是工作线程,并不会暴露所有的工作线程信息给你。
如果你想要知道线程池中有多少线程处于活动状态(正在运行任务),可以使用 `ExecutorService` 的 `activeCount()` 方法。例如:
```java
int activeThreads = executor.getActiveCount();
System.out.println("当前活跃线程数: " + activeThreads);
```
然而,线程池也可能有闲置的线程,它们是在等待新的任务到来。如果你想了解整个线程池的大小,应该关注 `getPoolSize()` 方法返回的值,即线程池能够持有的最大并发任务数,这通常是 THREAD_COUNT。
```java
int totalThreads = executor.getPoolSize();
System.out.println("线程池总线程数(最大并发量): " + totalThreads);
```
请注意,由于线程池的行为,这两个数字可能不完全一致,除非所有线程都在处理任务,否则 `activeCount()` 可能会小于 `getPoolSize()`。
List<UserEo> userEoList = comDataComponent.getUserListByUid();int batchSize = 1000; // 每批次处理1000个用户int threadCount = (userEoList.size() + batchSize - 1) / batchSize; // 计算需要开启的线程数ExecutorService executorService = Executors.newFixedThreadPool(threadCount);for (int i = 0; i < threadCount; i++) { int start = i * batchSize; int end = Math.min(start + batchSize, userEoList.size()); List<UserEo> subList = userEoList.subList(start, end); executorService.submit(() -> { for (UserEo userEo : subList) { List<DataPermissionSchema> userDataPermissionSchema = getUserDataPermissionSchema(userEo.getUserUid(), userEo.getOrgCode()); String redisKey = SystemsConstant.DATA_PERMISSION_SCHEMA + userEo.getUserUid(); redisTemplate.executePipelined((RedisCallback<Object>) connection -> { connection.set(redisTemplate.getKeySerializer().serialize(redisKey), redisTemplate.getValueSerializer().serialize(ObjectUtil.toString(userDataPermissionSchema))); return null; }); } });}executorService.shutdown();executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);改为手动创建线程池
可以将原来的代码改为手动创建线程池的方式,如下所示:
```
List<UserEo> userEoList = comDataComponent.getUserListByUid();
int batchSize = 1000; // 每批次处理1000个用户
int threadCount = (userEoList.size() + batchSize - 1) / batchSize; // 计算需要开启的线程数
ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
for (int i = 0; i < threadCount; i++) {
int start = i * batchSize;
int end = Math.min(start + batchSize, userEoList.size());
List<UserEo> subList = userEoList.subList(start, end);
Thread thread = new Thread(() -> {
for (UserEo userEo : subList) {
List<DataPermissionSchema> userDataPermissionSchema = getUserDataPermissionSchema(userEo.getUserUid(), userEo.getOrgCode());
String redisKey = SystemsConstant.DATA_PERMISSION_SCHEMA + userEo.getUserUid();
redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
connection.set(redisTemplate.getKeySerializer().serialize(redisKey), redisTemplate.getValueSerializer().serialize(ObjectUtil.toString(userDataPermissionSchema)));
return null;
});
}
});
executorService.submit(thread);
}
executorService.shutdown();
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
```
这个代码中,我们手动创建了线程池,并且使用了 `Thread` 类来创建线程。我们将任务放入线程中运行,并且使用 `executorService.submit(thread)` 方法将线程提交到线程池中。最后,我们关闭线程池,并等待所有任务执行完毕。
阅读全文