#java #multithreading #file #java-8
#java #многопоточность #файл #java-8
Вопрос:
Я хочу прочитать несколько файлов с помощью пула потоков, но мне не удалось.
@Test
public void test2() throws IOException {
String dir = "/tmp/acc2tid2999928854413665054";
int[] shardIds = new int[]{1, 2};
ExecutorService executorService = Executors.newFixedThreadPool(2);
for (int id : shardIds) {
executorService.submit(() -> {
try {
System.out.println(Files.readAllLines(Paths.get(dir, String.valueOf(id)), Charset.forName("UTF-8")));
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
Выше приведен простой пример, который я написал. Это не может достичь моей цели.
System.out.println(Files.readAllLines(
Paths.get(dir, String.valueOf(id)), Charset.forName("UTF-8")));
Эта строка не будет выполняться, и предупреждений не было. Я не знаю, почему?
Комментарии:
1. Какой результат вы получаете?
2. Это работает на моем компьютере. Вы уверены, что ваша платформа тестирования работает? И у вас на компьютере есть два файла с именами: «/tmp / acc2tid2999928854413665054 / 1» и «/tmp / acc2tid2999928854413665054 / 2»?
3. @StephanHogenboom Причина в том, что сказал тантал. Я думаю, что код может выполняться на вашем компьютере, потому что файлы, которые вы читаете, невелики. Таким образом, он может получить результат.
Ответ №1:
Вы отправляете задачи для выполнения, затем завершаете тест, прежде чем ждать завершения задач. ExecutorService::submit
отправит задачу, которая будет выполнена в будущем, и немедленно вернется. Таким образом, ваш цикл for отправляет две задачи, затем завершается, и тестовая функция возвращается до того, как задачи успели завершиться.
Вы можете попробовать вызвать ExecutorService::shutdown
после цикла for, чтобы сообщить исполнителю, что все задачи отправлены. Затем используйте ExecutorService::awaitTermination
для блокировки до завершения задач.
Например:
@Test
public void test2() throws IOException {
String dir = "/tmp/acc2tid2999928854413665054";
int[] shardIds = new int[]{1, 2};
ExecutorService executorService = Executors.newFixedThreadPool(2);
for (int id : shardIds) {
executorService.submit(
() -> {
try {
System.out.println(Files.readAllLines(Paths.get(dir, String.valueOf(id)), Charset.forName("UTF-8")));
} catch (IOException e) {
e.printStackTrace();
}
});
}
executorService.shutdown();
executorService.awaitTermination(60, TimeUnit.SECONDS); //Wait up to 1 minute for the tasks to complete
}