簡體   English   中英

java 中多線程的正確方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM