Реализация потоков через фьючерсы - PullRequest
2 голосов
/ 18 января 2012

Интересно, будет ли следующая реализация правильной

    ExecutorService pool = Executors.newFixedThreadPool(MAX_NSH_THREADS);
    Set<Future<Void>> futureRequest = new HashSet<Future<Void>>();

    for (String host : SomeCollection)) {
        Callable<Void> callable = new FileExtractor(j);
        Future<Void> future = pool.submit(callable);
        futureRequest.add(future);
    }

    for (Future<Void> future : futureRequest) {
        try {
            future.get(); 
        } catch (Exception e) {
            logger.error(e);
        }
    }

    pool.shutdown();

Согласно Javadoc, future.get() ожидает завершения выполнения для каждого потока, что (насколько я понимаю) означает, что для каждого изВ будущем мы будем ждать, чтобы получить результаты отдельно.Откуда тогда польза или я не правильно ее делаю?

Ответы [ 2 ]

4 голосов
/ 18 января 2012

Вы все делаете правильно.

Допустим, что SomeCollection содержит 100 элементов, что для запуска FileExtractor требуется 5 секунд, а пул потоков ExecutorService содержит 100 потоков.

Если вы начнете все так, как вы реализовали выше, ожидается, что код будет работать около 5 секунд, потому что FileExtractor скорее всего будет связан с вводом / выводом.(при условии максимальной эффективности процессора).

Если вы не использовали Future и все работало последовательно, вместо этого этот код работал бы около 500 секунд.

КлючFuture#get() ждет, пока результат будет заполнен Thread, начатым с отправки вашего Callable в ExecutorService, а не в ожидании метода ExecutorService#submit(Callable).

2 голосов
/ 18 января 2012

Каждое будущее начинается, как только вы отправите его, позвонив по номеру pool.submit.Если бы ваш основной поток выполнял какую-то другую работу (между началом фьючерса и ожиданием его окончания), может случиться так, что все ваши фьючерсы будут выполнены к тому времени, когда вы дойдете до второго цикла, так что практическине блокируйте.

И если метод get блокирует основной поток, пока вы ожидаете завершения первого Future, обратите внимание, что другие все еще работают параллельно (по крайней мере, потенциально, если достаточнопроцессорное время).

...