Как вы можете сказать, когда объект Future завершает свою задачу? - PullRequest
3 голосов
/ 23 мая 2019

Я использую Java 8. Мне было интересно, как вы можете определить, когда объект Future завершает свою задачу.Я попытался понять это, написав следующее

    Callable<Long> c = new Callable<Long>() {

        @Override
        public Long call() throws Exception {
            return new Long(factorial(1));
        }

    };

    ExecutorService s = Executors.newFixedThreadPool(2);
    Future<Long> f = s.submit(c);

    while (!f.isDone())
    {
        System.out.println("waiting..." + f.get().toString());
    }   // while
    System.out.println(f.get().toString());

, но цикл while никогда не возвращается (f.isDone () всегда ложно), хотя я могу сказать, что есть вычисленный результат.

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Это работает, однако вы никогда не закрываете созданный вами пул. Вы можете прочитать об этом в ExecutorService документации. Добавьте это в конце, чтобы закрыть свой бассейн:

s.shutdown();
try {
    if(!s.awaitTermination(3, TimeUnit.SECONDS)) {
          s.shutdownNow();
    }
} catch (InterruptedException e) {
    s.shutdownNow();
}

Дальнейшее объяснение :

Future::get является операцией блокировки. При некоторых обстоятельствах ваш цикл может никогда не быть вызван, потому что задача, поддерживаемая будущим, может быть завершена до того, как условие цикла будет оценено. Но в большинстве случаев в первой итерации цикла вы будете вызывать Future::get, который блокирует операцию. Затем вы получаете результат и снова условие цикла оценивается как ложное, потому что будущее сделано. В заключение - ваш цикл будет вызываться 0 или 1 раз. И после этого вы должны закрыть пул, как я писал ранее.

0 голосов
/ 23 мая 2019

Нет.Это будет сделано в ближайшее время.В вашем случае вы напечатаете «ожидание ... 1» и 1.

Если вы отладите, это будет очень ясно.

Что касается потока, продолжающего работу, то из-за исполнителей.

Потоки в пуле будут существовать до тех пор, пока он не будет явно отключен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...