【发布时间】:2021-06-17 01:59:29
【问题描述】:
问题:
我正在解析一个大型日志文件(大约 625_000_000 行)并将其保存到数据库中。
public class LogScheduler {
static int fileNumber = 1;
public Importer(IRequestService service) {
this.service = service;
}
@Override
public void run() {
try {
service.saveAll(getRequestListFromFile("segment_directory/Log_segment_"+fileNumber+".txt"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行这个线程的方法是:
public void scheduledDataSave() throws InterruptedException {
int availableCores = Runtime.getRuntime().availableProcessors();
String directory = "segment_directory";
int filesInDirectory = Objects.requireNonNull(new File(directory).list()).length;
ExecutorService executorService = Executors.newFixedThreadPool(availableCores);
for (int i = 1; i <= filesInDirectory; i++) {
executorService.execute(new Importer(service));
}
executorService.shutdown();
}
在每个线程执行后在executorService.execute(new Importer(service)); 休眠之后插入Thread.sleep(); 方法,而不是像应该的8 个线程,因为它们在Executorservice 中
而且我不知道为什么会发生这种情况,因为它不应该那样做。
据我了解,ExecutorService 应该并行运行 8 个线程,完成它们,休眠,然后再次启动池。
每8个线程后如何“睡觉”?
【问题讨论】:
-
The problem is the CPU spike- 为什么? -
@Eugene 我想说恒定的 100% CPU。我想找到一种方法来减少它,并结合睡眠来这样做
-
这可能与
ExecutorService无关,而是在所有这些文件之后需要清理的垃圾收集线程 -
你的问题不清楚。与其谈论您如何修改显示的代码,不如向我们展示您实际运行的代码。告诉我们你的目标,你想要达到的目标,因为那是模糊和不清楚的。由于不清楚,我是第二个投票结束。如果已关闭,请参与编辑您的问题,因为如果缺陷得到修复,它可以重新打开。
-
@BasilBourque 感谢您的指点。希望这更清楚
标签: java multithreading memory-leaks