【发布时间】:2018-02-14 05:44:50
【问题描述】:
我正在尝试搜索单词列表并查找多个文件中所有单词的总数。
我的逻辑是为每个文件设置单独的线程并获取计数。最后,我可以汇总从每个线程获得的总数。
假设,我有 50 个文件,每个文件 1MB。当我使用多个线程时,性能并没有提高。 FILE_THREAD_COUNT 并没有改善我的总执行时间。当我的线程数为 1 或 50 时,我得到几乎相同的执行时间。
我在使用执行器服务时做错了吗?
这是我的代码。
public void searchText(List<File> filesInPath, Set<String> searchWords) {
try {
BlockingQueue<File> filesBlockingQueue = new ArrayBlockingQueue<>(filesInPath.size());
filesBlockingQueue.addAll(filesInPath);
ExecutorService executorService = Executors.newFixedThreadPool(FILE_THREAD_COUNT);
int totalWordCount = 0;
while (!filesBlockingQueue.isEmpty()) {
Callable<Integer> task = () -> {
int wordCount = 0;
try {
File file = filesBlockingQueue.take();
try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) {
String currentLine;
while ((currentLine = bufferedReader.readLine()) != null) {
String[] words = currentLine.split("\\s+");
for (String word : words) {
for (String searchWord : searchWords) {
if (word.contains(searchWord)) {
wordCount++;
}
}
}
}
} catch (Exception e) {
// Handle error
}
} catch (Exception e) {
// Handle error
}
return wordCount;
};
totalWordCount += executorService.submit(task).get();
}
System.out.println("Final word count=" + totalWordCount);
executorService.shutdown();
} catch (Exception e) {
// Handle error
}
}
【问题讨论】:
标签: java multithreading executorservice