【问题标题】:correct way to multithread in java?java中多线程的正确方法?
【发布时间】:2022-01-23 01:24:14
【问题描述】:

在数组中搜索数字的普通版本:

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);
       }

但它不返回任何东西

【问题讨论】:

  • “它不返回任何东西”是什么意思?您是否有一个拥有实际数据的实际调用者?
  • 为我工作。我只是将方法设为静态并在 main 方法中运行它们。
  • 请注意,这种实现效率不会很高,因为它将调度与数组中的元素一样多的作业。此外,由于增加了开销,多线程这仅与大型数组相关。无论如何,在这里使用并行流会更合适、更简单。

标签: java multithreading concurrency parallel-processing completable-future


【解决方案1】:

多线程处理纯 CPU 密集型任务通常很困难,因为很难评估线程同步的开销并避免计算过多。

例如,您不希望在单独的任务中检查每个条目,因为开销会高于任务本身。此外,您还希望尽快停止该过程,即在找到匹配项后尽快停止。

幸运的是,Java 8 还提供了the Stream API,它可以轻松处理涉及(大量)数据集合的 CPU 密集型任务的并行性,因此您的方法实现变得简单:

boolean searchAsync(int x, int[] arr) {
    return Arrays.stream(arr).parallel().anyMatch(i -> i == x);
}

(请注意,如果没有 parallel(),它将完全等同于使用 for 循环的第一个示例)

【讨论】:

    猜你喜欢
    • 2014-01-15
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多