2015-02-21 12 views
10

Jak zachowuje się Java Future.get() w przypadku, gdy po wykonaniu zadania jest wywoływana wiele razy? Czy zwraca ten sam wynik? A może ponownie rzucić ExecutionException z tym samym wyjątkiem, jeśli obliczenia nie powiodły się? Nie mogę znaleźć niczego w dokumentach na ten temat!Java - Future.get() wielokrotne wywołania

+0

Sieć [Future] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html) klasy docs (i [Future.get] (https://docs.oracle.com/javase/8/docs /api/java/util/concurrent/Future.html#get--)) odpowiadają na większość pytań - musiało to być czytanie czegoś innego. – user2864740

+1

Możesz też spróbować i samemu zobaczyć. –

Odpowiedz

18

Możesz zadzwonić pod numer get() na Future tak często, jak chcesz, i to będzie blokować tylko wtedy, gdy zadanie, które doprowadziło do wyniku, jeszcze się nie zakończyło.

Jeśli zadanie zostało już zakończone, natychmiast zwróci wynik zadania.

Jeśli zadanie nie powiodło się z wyjątkiem, wywołanie get() spowoduje wyświetlenie ExecutionException przy każdym wywołaniu.

4

Nie mogę znaleźć niczego w dokumentach na ten temat!

Czy je czytasz? bo kiedy je czytać Dostałem odpowiedź i to jest tutaj ....

V get() 
throws InterruptedException, 
     ExecutionException 

Waits jeśli to konieczne dla obliczenia do wypełnienia, a następnie pobiera swój wynik.

Returns: 
    the computed result 

Throws: 
    CancellationException - if the computation was cancelled 
    ExecutionException - if the computation threw an exception 
    InterruptedException - if the current thread was interrupted while waiting 

Jeśli Obliczanie nie jest zakończona będzie czekać, a jeśli już zakończone zwróci wynik jak najszybciej, bez względu na to ile razy można nazwać

+0

Gdzie czytasz? w https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html#get-- Widzę: Czeka w razie potrzeby, aby zakończyć obliczenia, a następnie pobrać wynik . Bez ostatniej części. Skąd masz te informacje? Nie chcę polegać na nieudokumentowanym zachowaniu, wiem, co się stanie, jeśli spróbuję, ale chciałem dokładnej umowy. –

+0

@MarcoServetto, więc proszę uważnie przeczytać wiersz, będzie czekać, jeśli proces nie zostanie zakończony lub zwróci wynik, Nie jest nigdzie napisane, że wyjątek nadejdzie, jeśli wielokrotnie go wywołasz. "Otrzymuję te informacje, wypróbowując je, i następnie doszedł do wniosku " –