JAVA并发处理经验(四)并行模式与算法4:并行搜索模式

一、前言

在并行搜索模式中,主要是内存数据很大,需要查找的情况。因为我们通常需要查找数据库返回的结果据很少,在几百条以内。

但是在平台软件开发中,可能遇到并行搜索的情况。其实很简单就是将数据分段进行检索;

二、并行搜索模式

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


上一篇:MySQL 修改用户密码及重置root密码


下一篇:Cisco路由器上配置3A认证的故障调试