Как читать несколько файлов, используя пул потоков? - PullRequest
3 голосов
/ 12 апреля 2019

Я хочу прочитать несколько файлов, используя пул потоков, но мне не удалось.

@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 Ответ

7 голосов
/ 12 апреля 2019

Вы отправляете задачи для выполнения, затем заканчиваете тестирование, прежде чем дождаться их завершения. 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
    }
...