Java 使用多线程搜索列表并查找元素(不使用并行流)

Java 使用多线程搜索列表并查找元素(不使用并行流),java,multithreading,performance,parallel-processing,java-threads,Java,Multithreading,Performance,Parallel Processing,Java Threads,我有办法 public boolean contains(int valueToFind, List<Integer> list) { // } public boolean contains(int-valueToFind,List){ // } 如何将数组拆分为x个块?并且有一个新的线程来搜索每个块以寻找值。如果该方法返回true,我希望停止其他线程的搜索 我看到有很多简单地在线程之间分割工作的例子,但是我如何构造它,使一个线程返回true,所有线程返回true作为答案 出于

我有办法

public boolean contains(int valueToFind, List<Integer> list) {
//
}
public boolean contains(int-valueToFind,List){
//
}
如何将数组拆分为x个块?并且有一个新的线程来搜索每个块以寻找值。如果该方法返回true,我希望停止其他线程的搜索

我看到有很多简单地在线程之间分割工作的例子,但是我如何构造它,使一个线程返回true,所有线程返回true作为答案

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

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


您可以使用内置的
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);
}
//查看列表
公共布尔包含(int-valueToFind,List){
return list.parallelStream().anyMatch(Integer.valueOf(valueToFind)::等于);
}
//对于数组
公共布尔包含(int valueToFind,int[]arr){
返回Arrays.stream(arr.parallel().anyMatch(x->x==valueToFind);
}
:

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


创建流时,除非另有指定,否则它始终是串行流。要创建并行流,请调用该操作。我想你不明白这个问题。您不希望“所有线程都返回”。基本上忽略所有其他线程。但请注意:除非是出于学习目的,否则您应该使用提供给您的streams解决方案。我希望您理解,为了通过使用多个线程获得“加速”,您的列表需要非常大。