Bardzo ładnie wydzieliłaś operację wyznaczania odległości do zwierząt do osobnego wątku bo może ona zająć trochę czasu, jednak wywołując join powodujesz oczekiwanie na zakończenie tego dodatkowego wątku co zblokuje wątek, z którego wywołujesz distancesToAllAnimals - w tym wypadku jest to wątek główny. Taka implementacja niczym nie różni się od zapisania tej funkcji w standardowy blokujący sposób (bez dodatkowego wątku). Jeśli chcesz wykonać ją w tle, to musiałabyś przekazywać do tego osobnego wątku jakiś obiekt callback, który byłby powiadomiony po zakończeniu operacji i otrzymałby wynik, wtedy dopiero przerzucasz obsłużenie wyniku na wątek główny.