問題:考慮一個場景,其中有多個服務可以執行特定的任務。每項服務都可以用不同的時間響應任務。我們需要始終從速度最快的服務中選擇響應。如何從一組線程中提取最快響應線程的結果?
1
A
回答
-1
下面是使用RxJava Observables的示例工作代碼,該代碼打印來自一組線程的最快響應線程的結果。
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
如果我理解你的權利,你需要的東西是這樣的:
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
相關問題
- 1. 從線程獲取中間結果
- 2. 如何正確使用線程池並從線程中獲取結果?
- 3. Java線程:期貨只用結果從第一和最後一個線程
- 4. 如何從Python中的線程池中獲取結果?
- 5. 如何從線程以外的線程讀取組合框?
- 6. 如何從計算線程獲取結果到GUI線程 - 我需要QSharedMemory嗎?
- 7. 從設置線程組(jmeter)獲取線程組中的線程數
- 8. 一個線程中的崩潰如何影響其他線程。
- 9. 如何從子線程或其他線程獲取父線程?
- 10. 如何在另一個線程組中執行線程組?
- 11. 如何讓一個java線程等待另一個線程的結果?
- 12. 從NSString中提取線程的子串
- 13. 如何從一組GPS點中獲取「最快里程」列表
- 14. 從線程到主線程的交叉結果
- 15. 將一組對象從一個線程傳遞到另一個線程的最快數據存儲是什麼?
- 16. 從論壇中提取線程頭部和線程回覆
- 17. 如何從WebClient DownloadDataAsync(或其他)獲取多線程響應?
- 18. 從主結構中提取子結構以創建線程
- 19. 如何從線程完成時獲取結果?
- 20. 如何從AsyncTask獲取結果而不阻塞UI線程?
- 21. 從同一線程中中止線程
- 22. 在JMeter中如何傳遞BeanShell的採樣結果線程組
- 23. 從主線程或Web線程以外的線程獲取Web鎖定。 UIKit中不應該從輔助線程
- 24. 將結果從已取消的BackgroundWorker線程傳遞迴主線程
- 25. iOS的多線程響應
- 26. 等待的線程響應
- 27. 如何從線程組中刪除線程
- 28. 如何在線程池中響應已取消的futuretask?
- 29. 從線程得到錯誤的結果
- 30. C++從幾個線程返回結果到一個數組
不好的建議,這等待所有的人完成,然後拿第一個。 –
@DanieleSegato nope,如果你可以執行代碼,你會發現它不會等待它們全部完成。它會選擇BlockingObservable返回的FIRST項目。 – Sabarish
無論如何,請求調用merge + take(1)或合併+ first() –