Problem: Betrachten Sie ein Szenario, in dem mehrere Dienste eine bestimmte Aufgabe ausführen können. Jeder Dienst kann mit unterschiedlichem Zeitaufwand auf die Aufgabe reagieren. Wir müssen immer die Antwort von dem Dienst mit der schnellsten Leistung auswählen.Wie extrahiere ich das Ergebnis aus dem am schnellsten antwortenden Thread aus einer Gruppe von Threads?
1
A
Antwort
-1
Unten ist der Beispielarbeitscode, der RxJava Observables verwendet, der das Ergebnis aus dem am schnellsten reagierenden Thread aus einer Gruppe von Threads druckt.
public static void main(String[] args) {
// Create a slow thread which spans 5 secs
Callable<String> task1 = new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(5000);
return "task1";
}
};
// Create a faster thread which spans 1 secs
Callable<String> task2 = new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(1000);
return "task2";
}
};
List<Callable<String>> tasks = new ArrayList<>();
tasks.add(task1);
tasks.add(task2);
String result = null;
try {
result = Observable.from(tasks)
.subscribeOn(Schedulers.computation())
.flatMap(eachTask -> Observable.fromCallable(eachTask)
.subscribeOn(Schedulers.io())
.doOnNext(e -> System.out.println("Executing your action on "+Thread.currentThread().getName()))
.doOnError(e -> System.out.println("Failed reason for : "+Thread.currentThread().getName()+" with error "+e.getMessage()))
)
.toBlocking()
.first();
} catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println("result--->"+result);
}
3
Wenn ich Sie recht verstanden, müssen Sie etwas wie folgt aus:
taskSource
.flatMap(task -> // for each task
Observable.merge(
// submit same task to multiple services
service1.submit(task),
service2.submit(task),
...,
serviceN.submit(task)
)
.take(1)) // take first response; discard others
... // continue processing result of the task
.subscribe(...)
2
Sie wollen den Observable.amb
Operator. Es hat den Vorteil, mit Observablen mit mehr als einer Emission zu arbeiten.
+0
Danke wird es überprüfen. – Sabarish
Verwandte Themen
- 1. Anzahl der Threads in einer Thread-Gruppe aus der Setup-Thread-Gruppe (Jmeter)
- 2. Anzahl der Threads (definiert über BlazeMeter) in einer Thread-Gruppe aus der Setup-Thread-Gruppe (jmeter)
- 3. Wie extrahiere ich Daten aus einer DataTable?
- 4. Wie extrahiere ich rownames aus einer Matrix?
- 5. Gradle - Wie führe ich eine Gruppe von Dateien als einen Thread in einer Aufgabe aus?
- 6. Beenden eines sekundären Threads aus dem Haupt-Thread (Kakao)
- 7. Verwendet Parallel.ForEach Threads aus dem ASP.NET-Thread-Pool?
- 8. Wie extrahiere ich Inhalte aus einer JSON-Liste?
- 9. PERL extrahiere Werte aus einer Konfigurationsdatei
- 10. Wie kann ich Thread-Gruppen-Threads und Schleifen zählen aus einer Datei lesen?
- 11. Wie extrahiere ich Text aus einer PDF-Datei in Python?
- 12. SUM das Ergebnis einer Gruppe von Abfrage
- 13. Extrahiere Daten aus einem Vektor von Zeichenketten
- 14. Wie extrahiere ich Teilstrings aus einer maskierten Python-Zeichenkette?
- 15. Wie extrahiere ich Quellcode aus einer Jar-Datei?
- 16. Wie extrahiere ich Daten aus einer 4D Datenbank?
- 17. Wie extrahiere ich ein Datum aus einer UUID mit Java?
- 18. Tabellen & Javascript: Welche Formate sind am besten? Wie extrahiere ich Arrays aus einer Tabelle?
- 19. Wie bekomme ich die Thread-ID aus einem Thread-Pool?
- 20. Wie extrahiere ich einen Bereich aus einer Sammlung in Powershell?
- 21. Wie extrahiere ich Parameter aus einer HTTP-Response-Header-Zeichenfolge?
- 22. Wie extrahiere ich jedes aufeinanderfolgende Zeilenpaar effizient aus einer Datei?
- 23. Wie wähle ich eine Gruppe von Kindern aus dem Elternteil?
- 24. Wie extrahiere ich Daten aus einem IEnumerable?
- 25. Wie extrahiere ich ein Element aus einer XML-Datei?
- 26. Wie extrahiere ich einen Wert aus einer JSON-Zeichenkette?
- 27. Wie extrahiere ich ein Array aus einer Matrix in GAMS?
- 28. Wie extrahiere ich Bilder aus einer VB6 .frx-Datei?
- 29. Wie extrahiere ich einen Teilstring aus einer Textdatei?
- 30. sortieren das Ergebnis aus einer PyMongo Abfrage
schlechten Vorschlag, warten diese auf alle von ihnen zu vervollständigen und dann nehmen Sie die erste. –
@DanieleSegato Nein, wenn Sie den Code so ausführen könnten, wie er ist, würden Sie sehen, dass er NICHT auf ALLE wartet. Es wählt das FIRST-Element aus, das von BlockingObservable zurückgegeben wird. – Sabarish
unabhängig, fordert die Anfrage für merge + take (1) oder merge + first() –