Jestem nowym użytkownikiem funkcji współbieżności Java 8, takich jak CompletableFuture
i mam nadzieję, że pomożesz w rozpoczęciu korzystania z poniższego przykładu użycia.Java 8 - Połącz asynchroniczne połączenia równolegle i połącz ich wyniki.
Istnieje usługa o nazwie TimeConsumingServices
, która zapewnia czasochłonne operacje, które chciałbym uruchomić równolegle, ponieważ wszystkie z nich są niezależne.
interface TimeConsumingService {
default String hello(String name) {
System.out.println(System.currentTimeMillis() + " > hello " + name);
return "Hello " + name;
}
default String planet(String name) {
System.out.println(System.currentTimeMillis() + " > planet " + name);
return "Planet: " + name;
}
default String echo(String name) {
System.out.println(System.currentTimeMillis() + " > echo " + name);
return name;
}
default byte[] convert(String hello, String planet, String echo) {
StringBuilder sb = new StringBuilder();
sb.append(hello);
sb.append(planet);
sb.append(echo);
return sb.toString().getBytes();
}
}
Do tej pory zaimplementowałem następujący przykład i udało mi się połączyć wszystkie trzy metody obsługi równolegle.
public class Runner implements TimeConsumingService {
public static void main(String[] args) {
new Runner().doStuffAsync();
}
public void doStuffAsync() {
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> this.hello("Friend"));
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> this.planet("Earth"));
CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> this.echo("Where is my echo?"));
CompletableFuture.allOf(future1, future2, future3).join();
}
}
Czy istnieje sposób, aby zbierać wartości zwracanych każdego zgłoszenia serwisowego i wywołać metodę byte[]‘ convert(String, String, String)
?
Ale jeśli zadzwonię 'future1.get(); future2.get(); future3.get(); 'nie są wywoływane równolegle, prawda? – saw303
Wywołując metodę future1.get(), otrzymujemy już obliczony wynik. –
Tak uzyskiwanie wyników nie jest wywoływane równolegle, ale wszystkie metody będą obliczane asynchronicznie. Możesz to sprawdzić dodając 'TimeUnit.seconds (2) .sleep()'; po połączeniu metoda. Zobaczysz, że 'System.out.println' został wywołany przed snem. – user2377971