Вы ждете, пока истечет время ожидания, не позволяя потоку продолжить.Future.get
блокирует, и это никогда не позволит вам countDown
Latch
до истечения времени ожидания, следовательно, ваш поток никогда не завершится.Здесь необходимо сначала разрешить потоку вызвать countDown
на Latch
, а затем подождать с таймаутом в вызове get.Простое обращение двух строк решит проблему.Вот как это выглядит.
countDownLatch.countDown();
completableFuture.get(1000L, TimeUnit.MILLISECONDS);
На самом деле, если вы удалите тайм-аут из вызова get (он блокируется на неопределенный срок), то это типичный пример тупика в системе.Рабочий поток ожидает, пока основной поток не начнет обратный отсчет защелки, в то время как основной поток ожидает завершения рабочего потока, чтобы он мог продолжить и считать защелку.К счастью, истекшее время ожидания позволяет избежать вероятностного тупика.Напротив, вы можете cancel
будущее в любое время и избежать потенциальных тупиков, поскольку ваши задачи реагируют на прерывание.