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解决方案。我希望您理解,为了通过使用多个线程获得“加速”,您的列表需要非常大。