一、前言
在并行搜索模式中,主要是内存数据很大,需要查找的情况。因为我们通常需要查找数据库返回的结果据很少,在几百条以内。
但是在平台软件开发中,可能遇到并行搜索的情况。其实很简单就是将数据分段进行检索;
二、并行搜索模式
package pattern.search; import org.omg.PortableInterceptor.INACTIVE; import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; /** * Created by ycy on 16/1/16. * 适用场景:有很多系统变量需要查询,或者查询redis这样数据量大得list * web适用场景比较少,但是作为平台软件是很常用的 */ public class SearchDemo { //定义我们需要查询的无序数组 static int[] arr={1,22,2,3,4,5,344,6,7,8,10,9}; //定义线程池数据,已经存放结果的Result static ExecutorService pool= Executors.newCachedThreadPool(); static final int thread_num=2; static AtomicInteger result=new AtomicInteger(-1);//初始值定位-1 public static int search(int searchValue ,int beginPos,int endPos){ int j=0; for (j = beginPos; j <endPos ; j++) { if (result.get()>=0){ return result.get(); } if (arr[j]==searchValue){ //如果设置失败,表示其他现场已经先找到了 if (!result.compareAndSet(-1,j)){ //如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。 //-1当前值为-1就返回 return result.get(); } return j; } } return -1; } public static class SearchTask implements Callable<Integer>{ int begin,end,searchValue; public SearchTask(int searchValue,int begin,int end){ this.begin=begin; this.end=end; this.searchValue=searchValue; } public Integer call() throws Exception { int re=search(searchValue,begin,end); return re; } } public static int psearch(int searchValue) throws InterruptedException,ExecutionException{ int subArrSize=arr.length/thread_num+1; List<Future<Integer>> re=new ArrayList<Future<Integer>>(); for (int i = 0; i <arr.length ; i+=subArrSize) { int end=i+subArrSize; if (end>=arr.length) end=arr.length; re.add(pool.submit(new SearchTask(searchValue,i,end))); } for (Future<Integer> fu: re) { if (fu.get()>=0) return (fu.get()); } return -1; } public static void main(String[] args) { try { System.out.println(psearch(9)); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }