[英]correct way to multithread in java?
在數組中搜索數字的普通版本:
boolean search(int x, int[] arr) {
for (int i : arr) {
if (i == x) {
return true;
}
}
return false;
}
我的多線程方式:
boolean searchAsync(int x, int[] arr, int lo, int hi) {
if (lo == hi) {
return x == arr[lo];
}
int mid = (lo + hi) / 2;
CompletableFuture<Boolean> cf = CompletableFuture.<Boolean>supplyAsync(() -> searchAsync(x, arr, lo, mid));
boolean b = searchAsync(x, arr, mid + 1, hi);
return cf.thenApply(a -> a | b).join();
}
boolean searchAsync(int x, int[] arr) {
return searchAsync(x, arr, 0, arr.length - 1);
}
但它不返回任何東西
您可以使用並行流:
boolean search(int x, int[] arr) {
return Arrays.stream(arr).parallel()
.filter(i -> i == x)
.findAny()
.isPresent();
}
這樣您就不必自己處理多線程的低級機制。
多線程處理純 CPU 綁定的任務通常很困難,因為很難評估線程同步的開銷並避免計算過多。
例如,您不想檢查單獨任務中的每個條目,因為開銷會高於任務本身。 此外,您還希望盡快停止該過程,即在找到匹配項后盡快停止。
幸運的是,Java 8 還提供了Stream
API ,它可以輕松處理涉及(大)數據集合的 CPU 綁定方法任務的並行性,因此您的方法實現變得簡單:
boolean searchAsync(int x, int[] arr) {
return Arrays.stream(arr).parallel().anyMatch(i -> i == x);
}
(請注意,如果沒有parallel()
,它就完全等同於使用for
循環的第一個示例)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.