2015-03-31 13 views
5

Dokładniej: jeśli rozpocznę obliczenia asynchroniczne, wywołując metodę submit(Callable<T> task) na ExecutorService (sam zbudowany przy pomocy Executors.newCachedThreadPool()), mogę poczekać na zakończenie obliczeń i pobranie wynik przez wywołanie Future.get().Java Callable: Co stanie się z wątkiem, zanim get() zostanie wywołany

Moje pytanie brzmi: jeśli obliczenia są już zakończone, co się stanie, dopóki nie zadzwonię pod numer get()? Czy wątek jest blokowany, dopóki nie uzyskałem wyniku? Czy wynik jest przechowywany i wątek jest przypisany do innego zadania? Coś zupełnie innego?

Dzięki z góry za pan odpowie

Odpowiedz

4

Nie, wątek nie jest zablokowany, jest ona zwracana do puli. Ogólnie jest to wątek wywołujący get() zależny od pracownika, a nie odwrotnie. Więc jeśli jest wynik, zwróć go, jeśli nie, poczekaj, aż będzie dostępny.

+0

Dzięki za odpowiedź! Dla pewności, że rozumiem cię poprawnie (przepraszam, angielski nie jest moim językiem ojczystym): Jeśli uruchomię kilka wątków dla obliczeń i otrzymam wynik dopiero dużo później, gdy wszystkie zostaną zakończone, to nie jest problem, ponieważ ukończone zadania nie używają żadnych zasoby, prawda? –

+0

@ shadow_heart Wynik obliczenia (= zadanie) jest przechowywany w obiekcie 'Future', więc możesz' get() 'go, kiedy tylko chcesz. 'get()' blokuje tylko wywołujący wątek w przypadku, gdy obliczenia jeszcze się nie zakończyły. – isnot2bad

Powiązane problemy