【问题标题】:Searching a list using multiple threads and find element (without using parallel streams)使用多个线程搜索列表并查找元素(不使用并行流)
【发布时间】:2021-02-10 16:03:09
【问题描述】:

我有办法

public boolean contains(int valueToFind, List<Integer> list) {
//
}

如何将数组拆分为 x 个块?并有一个新线程来搜索每个块以查找值。如果方法返回true,我想阻止其他线程搜索。

我看到有很多简单地在线程之间拆分工作的示例,但是我如何构建它以便一旦一个线程返回 true,所有线程都返回它作为答案?

出于这个原因,我不想使用并行流(来自source):

如果您这样做,请再次查看前面的示例。有一个大 错误。你看到了吗?问题是所有并行流都使用 常见的fork-join线程池,如果你提交一个长时间运行的任务, 您有效地阻塞了池中的所有线程。因此,您阻止 所有其他使用并行流的任务。想象一个 servlet 环境,当一个请求调用 getStockInfo() 而另一个 计数素数()。一个会阻止另一个,即使他们每个人 需要不同的资源。更糟糕的是,你不能指定线程 并行流池;整个类加载器必须使用相同的 一个。

【问题讨论】:

  • 我想你不明白这个问题。您不希望“所有线程都返回”。您基本上忽略了所有其他线程。但请注意:除非这是出于学习目的,否则您应该使用提供给您的流解决方案。我希望您明白,您的列表需要非常大才能通过使用多个线程来获得“加速”。

标签: java multithreading performance parallel-processing java-threads


【解决方案1】:

您可以使用内置的Stream API:

//For a List
public boolean contains(int valueToFind, List<Integer> list) {
   return list.parallelStream().anyMatch(Integer.valueOf(valueToFind)::equals);
}

//For an array
public boolean contains(int valueToFind, int[] arr){
   return Arrays.stream(arr).parallel().anyMatch(x -> x == valueToFind);
}

Executing Streams in Parallel:

您可以串行或并行执行流。当流并行执行时,Java 运行时会将流划分为多个子流。聚合操作迭代并并行处理这些子流,然后组合结果。

创建流时,除非另有说明,否则它始终是串行流。要创建并行流,请调用操作Collection.parallelStream

【讨论】:

    猜你喜欢
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    相关资源
    最近更新 更多