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


目录
相关文章
|
1月前
|
算法 机器学习/深度学习 索引
【算法设计与分析】——搜索算法
【算法设计与分析】——搜索算法
40 1
|
1月前
|
算法 程序员 数据处理
算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解
算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解
|
3月前
|
算法 测试技术 C#
【动态规划】【记忆化搜索】【C++算法】664. 奇怪的打印机
【动态规划】【记忆化搜索】【C++算法】664. 奇怪的打印机
|
3月前
|
算法
【算法系列篇】递归、搜索和回溯(四)
【算法系列篇】递归、搜索和回溯(四)
|
2月前
|
算法 测试技术 C++
【记忆化搜索】【剪枝】【C++算法】1553吃掉 N 个橘子的最少天数
【记忆化搜索】【剪枝】【C++算法】1553吃掉 N 个橘子的最少天数
|
2月前
|
算法 测试技术 C++
【动态规划】【记忆化搜索】【C++算法】664. 奇怪的打印机
【动态规划】【记忆化搜索】【C++算法】664. 奇怪的打印机
|
2月前
|
移动开发 算法 测试技术
【动态规划】【记忆化搜索】C++算法:546移除盒子
【动态规划】【记忆化搜索】C++算法:546移除盒子
|
2月前
|
算法 Java
BFS(广度搜索|宽度搜索)无向图遍历(JAVA手把手深入解析)
BFS(广度搜索|宽度搜索)无向图遍历(JAVA手把手深入解析)
46 0
|
2月前
|
数据采集 算法 Java
DFS(深度搜索)无向图遍历(JAVA手把手深入解析)
DFS(深度搜索)无向图遍历(JAVA手把手深入解析)
41 0
|
2月前
|
Java Docker 容器
百度搜索:蓝易云【Docker使用之java项目工程的部署】
通过以上步骤,你已经成功在Docker中部署了Java项目工程。这样可以确保你的应用在不同环境中具有一致的运行结果,并且方便地进行部署和管理。
36 7